[Scummvm-git-logs] scummvm master -> 133a86280ca59ac6a5007723af5b59ff7a185086

dreammaster noreply at scummvm.org
Sat Jul 4 12:08:17 UTC 2026


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

Summary:
133a86280c MADS: PHANTOM: Adding support for demo


Commit: 133a86280ca59ac6a5007723af5b59ff7a185086
    https://github.com/scummvm/scummvm/commit/133a86280ca59ac6a5007723af5b59ff7a185086
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-07-04T22:07:59+10:00

Commit Message:
MADS: PHANTOM: Adding support for demo

Changed paths:
    engines/mads/madsv2/animview/animview.cpp
    engines/mads/madsv2/animview/animview.h
    engines/mads/madsv2/animview/functions.cpp
    engines/mads/madsv2/core/config.cpp
    engines/mads/madsv2/core/game.cpp
    engines/mads/madsv2/core/kernel.cpp
    engines/mads/madsv2/phantom/main.cpp
    engines/mads/madsv2/phantom/phantom.cpp
    engines/mads/madsv2/phantom/sound_phantom.cpp
    engines/mads/madsv2/phantom/sound_phantom.h


diff --git a/engines/mads/madsv2/animview/animview.cpp b/engines/mads/madsv2/animview/animview.cpp
index 26ee374fdf0..d35abd7d6d3 100644
--- a/engines/mads/madsv2/animview/animview.cpp
+++ b/engines/mads/madsv2/animview/animview.cpp
@@ -68,12 +68,12 @@ int imageFrame;
 CycleList anim_cycle_list;
 bool has_cycles;
 int currentViewX, currentViewY;
+int concat_mode;
 
 static const byte FX_TIMES[16] = {
 	0, 110, 110, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0
 };
 
-static int concat_mode;
 static bool has_sound_file;
 static char sound_file_name[80];
 static TileMapHeader picture_map, depth_map;
@@ -96,7 +96,7 @@ static bool hasAnimInited;
 static int runVal1, runVal2, runVal3;
 static int runVal12;
 static int error_code;
-static bool wait_for_music_at_end;
+bool wait_for_music_at_end;
 
 /**
  * Initializes animview global variables
diff --git a/engines/mads/madsv2/animview/animview.h b/engines/mads/madsv2/animview/animview.h
index 44f9f918207..9874de480e2 100644
--- a/engines/mads/madsv2/animview/animview.h
+++ b/engines/mads/madsv2/animview/animview.h
@@ -52,7 +52,8 @@ extern int imageFrame;
 extern CycleList anim_cycle_list;
 extern bool has_cycles;
 extern int currentViewX, currentViewY;
-
+extern int concat_mode;
+extern bool wait_for_music_at_end;
 
 // Main animview function
 extern void animview_main(const char *resName);
diff --git a/engines/mads/madsv2/animview/functions.cpp b/engines/mads/madsv2/animview/functions.cpp
index add2ccdd55d..84631ecc5ee 100644
--- a/engines/mads/madsv2/animview/functions.cpp
+++ b/engines/mads/madsv2/animview/functions.cpp
@@ -80,6 +80,10 @@ void add_anim(const char *name) {
  */
 void flag_parse(const char *param) {
 	switch (tolower(*param++)) {
+	case 'j':
+		wait_for_music_at_end = true;
+		break;
+
 	case 'o':
 		// Specify opening special effect
 		assert(anim_count < MAX_ANIM);
@@ -87,6 +91,11 @@ void flag_parse(const char *param) {
 			anim_list[anim_count].fx = atoi(param + 1);
 		break;
 
+	case 'p':
+		// Switch MADS path mode to CONCAT
+		concat_mode = 1;
+		break;
+
 	case 'r':
 		// -r[:abn] Resynch timer (always, beginning, never)
 		if (*param == ':') {
diff --git a/engines/mads/madsv2/core/config.cpp b/engines/mads/madsv2/core/config.cpp
index b48d6c62084..9c8804d7a84 100644
--- a/engines/mads/madsv2/core/config.cpp
+++ b/engines/mads/madsv2/core/config.cpp
@@ -24,6 +24,7 @@
 #include "mads/madsv2/core/env.h"
 #include "mads/madsv2/core/inter.h"
 #include "mads/madsv2/core/kernel.h"
+#include "mads/madsv2/engine.h"
 
 namespace MADS {
 namespace MADSV2 {
@@ -69,7 +70,8 @@ void read_config_file() {
 	config_file.show_speech_boxes = ConfMan.getBool("show_speech_boxes");
 	config_file.original_save_load = ConfMan.getBool("original_menus");
 
-	game.difficulty = ConfMan.getInt("difficulty");
+	if (ConfMan.hasKey("difficulty") && !g_engine->isDemo())
+		game.difficulty = ConfMan.getInt("difficulty");
 }
 
 void write_config_file() {
diff --git a/engines/mads/madsv2/core/game.cpp b/engines/mads/madsv2/core/game.cpp
index a8905501b97..adaf0ede427 100644
--- a/engines/mads/madsv2/core/game.cpp
+++ b/engines/mads/madsv2/core/game.cpp
@@ -198,7 +198,7 @@ void game_cold_data_init() {
 	kernel.cursor_y[0] = display_y >> 1;
 	kernel.cursor_y[1] = inter_base_y + 5;
 
-	game.difficulty = -1;
+	game.difficulty = g_engine->isDemo() ? 0 : -1;
 
 	kernel.paused = false;
 	kernel.cause_pause = false;
diff --git a/engines/mads/madsv2/core/kernel.cpp b/engines/mads/madsv2/core/kernel.cpp
index 6f0454b2696..cd9f35034b4 100644
--- a/engines/mads/madsv2/core/kernel.cpp
+++ b/engines/mads/madsv2/core/kernel.cpp
@@ -907,9 +907,6 @@ int kernel_seq_pingpong(int series_id, int mirror,
 int kernel_seq_pingpong_scroll(int series_id, int mirror,
 		word ticks, word interval_ticks, word start_ticks, int expire) {
 	int depth = 0;
-	SpritePtr sprite;
-
-	sprite = &series_list[series_id]->index[0];
 
 	return kernel_seq_add(series_id, mirror, 1, 0, 0, AA_PINGPONG, 1,
 		depth, 100, true, 0, 0, ticks, interval_ticks,
diff --git a/engines/mads/madsv2/phantom/main.cpp b/engines/mads/madsv2/phantom/main.cpp
index f9c24c8db11..131c36069cc 100644
--- a/engines/mads/madsv2/phantom/main.cpp
+++ b/engines/mads/madsv2/phantom/main.cpp
@@ -264,9 +264,11 @@ void phantom_main() {
 
 	if (ConfMan.getBool("start_game") || ConfMan.hasKey("save_slot"))
 		selected_item = 0;
-	else if (ConfMan.getBool("start_intro"))
+	else if (g_engine->isDemo() || ConfMan.getBool("start_intro"))
+		// Show the intro
 		selected_item = 3;
 	else
+		// Show the title screen
 		selected_item = -1;
 
 	while (!g_engine->shouldQuit()) {
@@ -298,8 +300,14 @@ void phantom_main() {
 			return;
 
 		case 3:
-			AnimView::animview_main("@phantom");
-			selected_item = -1;
+			// Show the intro
+			if (g_engine->isDemo()) {
+				AnimView::animview_main("@demodisk");
+				selected_item = 0;
+			} else {
+				AnimView::animview_main(g_engine->isDemo() ? "@demodisk" : "@phantom");
+				selected_item = -1;
+			}
 			break;
 
 		case 4:
diff --git a/engines/mads/madsv2/phantom/phantom.cpp b/engines/mads/madsv2/phantom/phantom.cpp
index 62904d8c891..73a8684e47a 100644
--- a/engines/mads/madsv2/phantom/phantom.cpp
+++ b/engines/mads/madsv2/phantom/phantom.cpp
@@ -65,7 +65,7 @@ Common::Error PhantomEngine::run() {
 	}
 
 	// Set up sound manager
-	_soundManager = new PhantomSoundManager(_mixer, _soundFlag);
+	_soundManager = new PhantomSoundManager(_mixer, _soundFlag, isDemo());
 	_soundManager->validate();
 
 	// Run the game
@@ -164,6 +164,13 @@ void PhantomEngine::global_init_code() {
 	himem_preload_series("*RTK_6", GLOBAL);
 	himem_preload_series("*RTK_9", GLOBAL);
 	himem_preload_series("*RALRH_9", GLOBAL);
+
+	if (g_engine->isDemo()) {
+		inter_move_object(key, PLAYER);
+		inter_move_object(lantern, PLAYER);
+		inter_move_object(small_note, PLAYER);
+		inter_move_object(rope, PLAYER);
+	}
 }
 
 void PhantomEngine::section_music(int section_num) {
diff --git a/engines/mads/madsv2/phantom/sound_phantom.cpp b/engines/mads/madsv2/phantom/sound_phantom.cpp
index 574e324ae9a..fe44624af24 100644
--- a/engines/mads/madsv2/phantom/sound_phantom.cpp
+++ b/engines/mads/madsv2/phantom/sound_phantom.cpp
@@ -43,21 +43,37 @@ void PhantomSoundManager::validate() {
 		"3d4843074c1dcbfd7919179c58aec9bc"
 	};
 
-	for (int i = 1; i <= 9; ++i) {
-		if (i >= 6 && i <= 8)
-			continue;
-		Common::Path filename(Common::String::format("asound.ph%d", i));
-		if (!f.open(filename))
-			error("Could not process - %s", filename.toString().c_str());
+	if (!_isDemo) {
+		for (int i = 1; i <= 9; ++i) {
+			if (i >= 6 && i <= 8)
+				continue;
+			Common::Path filename(Common::String::format("asound.ph%d", i));
+			if (!f.open(filename))
+				error("Could not process - %s", filename.toString().c_str());
+			Common::String md5str = Common::computeStreamMD5AsString(f, 8192);
+			f.close();
+
+			if (md5str != MD5[i - 1])
+				error("Invalid sound file - %s", filename.toString().c_str());
+		}
+	} else {
+		// For demo we only have one sound driver
+		if (!f.open("asound.pha"))
+			error("Could not process - asound.pha");
 		Common::String md5str = Common::computeStreamMD5AsString(f, 8192);
 		f.close();
 
-		if (md5str != MD5[i - 1])
-			error("Invalid sound file - %s", filename.toString().c_str());
+		if (md5str != "49aecc9c42b3d2f3be01611747f9649a")
+			error("Invalid sound file - asound.pha");
 	}
 }
 
 void PhantomSoundManager::loadDriver(int sectionNumber) {
+	if (_isDemo) {
+		_driver = new ASoundDemo(_mixer, _opl);
+		return;
+	}
+
 	switch (sectionNumber) {
 	case 1:
 		_driver = new ASound1(_mixer, _opl);
@@ -1568,6 +1584,270 @@ int ASound9::command71() {
 	return 0;
 }
 
+/*-----------------------------------------------------------------------*/
+
+const ASoundDemo::CommandPtr ASoundDemo::_commandList[30] = {
+	&ASoundDemo::command0,  &ASoundDemo::command1,  &ASoundDemo::command2,  &ASoundDemo::command3,
+	&ASoundDemo::command4,  &ASoundDemo::command5,  &ASoundDemo::command6,  &ASoundDemo::command7,
+	&ASoundDemo::command8,  &ASoundDemo::command9,  &ASoundDemo::command10, &ASoundDemo::command11,
+	&ASoundDemo::command12, &ASoundDemo::command13, &ASoundDemo::command14, &ASoundDemo::command15,
+	&ASoundDemo::command16, &ASoundDemo::command17, &ASoundDemo::command18, &ASoundDemo::command19,
+	&ASoundDemo::command20, &ASoundDemo::command21, &ASoundDemo::command22, &ASoundDemo::command23,
+	&ASoundDemo::command24, &ASoundDemo::command25, &ASoundDemo::command26, &ASoundDemo::command27,
+	&ASoundDemo::command28, &ASoundDemo::command29
+};
+
+ASoundDemo::ASoundDemo(Audio::Mixer *mixer, OPL::OPL *opl) :
+		ASound(mixer, opl, "asound.pha", 0x2240, 0x6f30) {
+	// Load sound samples
+	auto samplesStream = getDataStream(0x1d8);
+	for (int i = 0; i < 256; ++i)
+		_samples.push_back(AdlibSample(samplesStream));
+}
+
+int ASoundDemo::command(int commandId, int param) {
+	return (commandId <= 29) ? (this->*_commandList[commandId])() : 0;
+}
+
+// commands 0-8: delegate to base ASound
+int ASoundDemo::command0() { return ASound::command0(); }
+int ASoundDemo::command1() { return ASound::command1(); }
+int ASoundDemo::command2() { return ASound::command2(); }
+int ASoundDemo::command3() { return ASound::command3(); }
+int ASoundDemo::command4() { return ASound::command4(); }
+int ASoundDemo::command5() { return ASound::command5(); }
+int ASoundDemo::command6() { return ASound::command6(); }
+int ASoundDemo::command7() { return ASound::command7(); }
+int ASoundDemo::command8() { return ASound::command8(); }
+
+int ASoundDemo::command9() {
+	ASound::command1();
+	findFreeChannelFull(loadData(0x59EC));
+	findFreeChannelFull(loadData(0x5B33));
+	findFreeChannelFull(loadData(0x5B87));
+	findFreeChannelFull(loadData(0x5C63));
+	findFreeChannelFull(loadData(0x5D03));
+	findFreeChannelFull(loadData(0x5DA1));
+	findFreeChannelFull(loadData(0x5DED));
+	findFreeChannelFull(loadData(0x5E73));
+	return 0;
+}
+
+// no-op
+int ASoundDemo::command10() {
+	return 0;
+}
+
+int ASoundDemo::command11() {
+	ASound::command1();
+	findFreeChannelFull(loadData(0x46D4));
+	findFreeChannelFull(loadData(0x46F7));
+	findFreeChannelFull(loadData(0x4718));
+	findFreeChannelFull(loadData(0x4734));
+	findFreeChannelFull(loadData(0x4755));
+	return 0;
+}
+
+int ASoundDemo::command12() {
+	ASound::command1();
+	findFreeChannelFull(loadData(0x17D8));
+	findFreeChannelFull(loadData(0x1A2F));
+	findFreeChannelFull(loadData(0x1B40));
+	findFreeChannelFull(loadData(0x1C5F));
+	findFreeChannelFull(loadData(0x1D50));
+	findFreeChannelFull(loadData(0x1E12));
+	return 0;
+}
+
+int ASoundDemo::command13() {
+	ASound::command1();
+	findFreeChannelFull(loadData(0x562E));
+	findFreeChannelFull(loadData(0x5762));
+	findFreeChannelFull(loadData(0x581C));
+	findFreeChannelFull(loadData(0x58B9));
+	findFreeChannelFull(loadData(0x593E));
+	return 0;
+}
+
+int ASoundDemo::command14() {
+	ASound::command1();
+	findFreeChannelFull(loadData(0x520A));
+	findFreeChannelFull(loadData(0x526A));
+	findFreeChannelFull(loadData(0x5322));
+	findFreeChannelFull(loadData(0x55D3));
+	return 0;
+}
+
+int ASoundDemo::command15() {
+	ASound::command1();
+	findFreeChannelFull(loadData(0x4776));
+	findFreeChannelFull(loadData(0x4946));
+	findFreeChannelFull(loadData(0x4B2F));
+	findFreeChannelFull(loadData(0x4CB9));
+	findFreeChannelFull(loadData(0x4E7B));
+	findFreeChannelFull(loadData(0x5107));
+	findFreeChannelFull(loadData(0x51AF));
+	return 0;
+}
+
+// command1, load ch0-5 directly
+int ASoundDemo::command16() {
+	ASound::command1();
+	_channels[0]->load(loadData(0x3140));
+	_channels[1]->load(loadData(0x33FD));
+	_channels[2]->load(loadData(0x35F1));
+	_channels[3]->load(loadData(0x382B));
+	_channels[4]->load(loadData(0x39B7));
+	_channels[5]->load(loadData(0x3B27));
+	return 0;
+}
+
+int ASoundDemo::command17() {
+	ASound::command1();
+	findFreeChannelFull(loadData(0x5ED0));
+	findFreeChannelFull(loadData(0x5F2F));
+	findFreeChannelFull(loadData(0x6012));
+	findFreeChannelFull(loadData(0x6057));
+	findFreeChannelFull(loadData(0x6077));
+	return 0;
+}
+
+int ASoundDemo::command18() {
+	ASound::command1();
+	findFreeChannelFull(loadData(0x6098));
+	findFreeChannelFull(loadData(0x60EE));
+	findFreeChannelFull(loadData(0x6153));
+	return 0;
+}
+
+int ASoundDemo::command19() {
+	ASound::command1();
+	findFreeChannelFull(loadData(0x61AA));
+	findFreeChannelFull(loadData(0x6219));
+	findFreeChannelFull(loadData(0x6291));
+	findFreeChannelFull(loadData(0x6301));
+	findFreeChannelFull(loadData(0x6389));
+	findFreeChannelFull(loadData(0x6425));
+	findFreeChannelFull(loadData(0x6457));
+	return 0;
+}
+
+int ASoundDemo::command20() {
+	ASound::command1();
+	findFreeChannelFull(loadData(0x64A2));
+	findFreeChannelFull(loadData(0x6529));
+	findFreeChannelFull(loadData(0x6561));
+	findFreeChannelFull(loadData(0x658D));
+	return 0;
+}
+
+int ASoundDemo::command21() {
+	ASound::command1();
+	findFreeChannelFull(loadData(0x65F8));
+	findFreeChannelFull(loadData(0x6653));
+	findFreeChannelFull(loadData(0x66B7));
+	findFreeChannelFull(loadData(0x6719));
+	findFreeChannelFull(loadData(0x675D));
+	findFreeChannelFull(loadData(0x67A5));
+	findFreeChannelFull(loadData(0x67CB));
+	return 0;
+}
+
+int ASoundDemo::command22() {
+	ASound::command1();
+	findFreeChannelFull(loadData(0x3D16));
+	findFreeChannelFull(loadData(0x3D66));
+	findFreeChannelFull(loadData(0x3E4E));
+	findFreeChannelFull(loadData(0x3EB7));
+	findFreeChannelFull(loadData(0x3F11));
+	findFreeChannelFull(loadData(0x4168));
+	findFreeChannelFull(loadData(0x447D));
+	return 0;
+}
+
+int ASoundDemo::command23() {
+	ASound::command1();
+	findFreeChannelFull(loadData(0x451C));
+	findFreeChannelFull(loadData(0x455C));
+	findFreeChannelFull(loadData(0x4581));
+	findFreeChannelFull(loadData(0x45A6));
+	findFreeChannelFull(loadData(0x4604));
+	findFreeChannelFull(loadData(0x4663));
+	findFreeChannelFull(loadData(0x469E));
+	return 0;
+}
+
+int ASoundDemo::command24() {
+	ASound::command1();
+	findFreeChannelFull(loadData(0x67F2));
+	findFreeChannelFull(loadData(0x6825));
+	findFreeChannelFull(loadData(0x6851));
+	findFreeChannelFull(loadData(0x6885));
+	findFreeChannelFull(loadData(0x68BD));
+	findFreeChannelFull(loadData(0x68E3));
+	return 0;
+}
+
+int ASoundDemo::command25() {
+	ASound::command1();
+	findFreeChannelFull(loadData(0x6918));
+	findFreeChannelFull(loadData(0x695D));
+	findFreeChannelFull(loadData(0x69C1));
+	findFreeChannelFull(loadData(0x6A09));
+	findFreeChannelFull(loadData(0x6A73));
+	findFreeChannelFull(loadData(0x6AAF));
+	findFreeChannelFull(loadData(0x6AF5));
+	findFreeChannelFull(loadData(0x6AFC));
+	return 0;
+}
+
+int ASoundDemo::command26() {
+	ASound::command1();
+	findFreeChannelFull(loadData(0x1E94));
+	findFreeChannelFull(loadData(0x1F89));
+	findFreeChannelFull(loadData(0x2001));
+	findFreeChannelFull(loadData(0x20B9));
+	findFreeChannelFull(loadData(0x2167));
+	findFreeChannelFull(loadData(0x217E));
+	findFreeChannelFull(loadData(0x2195));
+	findFreeChannelFull(loadData(0x21AC));
+	return 0;
+}
+
+int ASoundDemo::command27() {
+	ASound::command1();
+	findFreeChannelFull(loadData(0x21C4));
+	findFreeChannelFull(loadData(0x2333));
+	findFreeChannelFull(loadData(0x2445));
+	findFreeChannelFull(loadData(0x24ED));
+	findFreeChannelFull(loadData(0x24FB));
+	findFreeChannelFull(loadData(0x250D));
+	findFreeChannelFull(loadData(0x251F));
+	findFreeChannelFull(loadData(0x252F));
+	return 0;
+}
+
+int ASoundDemo::command28() {
+	findFreeChannelFull(loadData(0x2538));
+	findFreeChannelFull(loadData(0x26BF));
+	findFreeChannelFull(loadData(0x2833));
+	findFreeChannelFull(loadData(0x285F));
+	findFreeChannelFull(loadData(0x288F));
+	findFreeChannelFull(loadData(0x28BB));
+	findFreeChannelFull(loadData(0x28E7));
+	findFreeChannelFull(loadData(0x2917));
+	findFreeChannelFull(loadData(0x2947));
+	return 0;
+}
+
+int ASoundDemo::command29() {
+	findFreeChannelFull(loadData(0x2962));
+	findFreeChannelFull(loadData(0x2CA1));
+	findFreeChannelFull(loadData(0x2DF5));
+	findFreeChannelFull(loadData(0x3021));
+	return 0;
+}
+
 } // namespace Phantom
 } // namespace MADSV2
 } // namespace MADS
diff --git a/engines/mads/madsv2/phantom/sound_phantom.h b/engines/mads/madsv2/phantom/sound_phantom.h
index ebe3f92c4a7..b8f2ad3e126 100644
--- a/engines/mads/madsv2/phantom/sound_phantom.h
+++ b/engines/mads/madsv2/phantom/sound_phantom.h
@@ -29,11 +29,14 @@ namespace MADSV2 {
 namespace Phantom {
 
 class PhantomSoundManager : public SoundManager {
+private:
+	bool _isDemo;
+
 protected:
 	void loadDriver(int sectionNum) override;
 
 public:
-	PhantomSoundManager(Audio::Mixer *mixer, bool &soundFlag) : SoundManager(mixer, soundFlag) {
+	PhantomSoundManager(Audio::Mixer *mixer, bool &soundFlag, bool isDemo) : SoundManager(mixer, soundFlag), _isDemo(isDemo) {
 	}
 	~PhantomSoundManager() override {
 	}
@@ -385,6 +388,49 @@ public:
 	int command(int commandId, int param) override;
 };
 
+class ASoundDemo : public ASound {
+private:
+	typedef int (ASoundDemo:: *CommandPtr)();
+	int command0();
+	int command1();
+	int command2();
+	int command3();
+	int command4();
+	int command5();
+	int command6();
+	int command7();
+	int command8();
+	int command9();
+	int command10();
+	int command11();
+	int command12();
+	int command13();
+	int command14();
+	int command15();
+	int command16();
+	int command17();
+	int command18();
+	int command19();
+	int command20();
+	int command21();
+	int command22();
+	int command23();
+	int command24();
+	int command25();
+	int command26();
+	int command27();
+	int command28();
+	int command29();
+
+	static const CommandPtr _commandList[30];
+
+public:
+	ASoundDemo(Audio::Mixer *mixer, OPL::OPL *opl);
+	~ASoundDemo() override {
+	}
+	int command(int commandId, int param) override;
+};
+
 } // namespace Phantom
 } // namespace MADSV2
 } // namespace MADS




More information about the Scummvm-git-logs mailing list