[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