[Scummvm-git-logs] scummvm master -> af56ac89ef339a879520a153260b6893bddbe084
elasota
noreply at scummvm.org
Mon Jun 20 23:33:58 UTC 2022
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
af56ac89ef MTROPOLIS: Add detection for Obsidian demos, support for Mac, preliminary support for PC
Commit: af56ac89ef339a879520a153260b6893bddbe084
https://github.com/scummvm/scummvm/commit/af56ac89ef339a879520a153260b6893bddbe084
Author: eientei (einstein95 at users.noreply.github.com)
Date: 2022-06-20T19:33:56-04:00
Commit Message:
MTROPOLIS: Add detection for Obsidian demos, support for Mac, preliminary support for PC
Changed paths:
engines/mtropolis/detection_tables.h
engines/mtropolis/mtropolis.cpp
diff --git a/engines/mtropolis/detection_tables.h b/engines/mtropolis/detection_tables.h
index 0dd6d143808..638e502fc26 100644
--- a/engines/mtropolis/detection_tables.h
+++ b/engines/mtropolis/detection_tables.h
@@ -29,11 +29,11 @@
namespace MTropolis {
static const MTropolisGameDescription gameDescriptions[] = {
- {
- // Obsidian Macintosh
+
+ { // Obsidian Macintosh
{
"obsidian",
- "V1.0, 1/13/97, installed, CD",
+ "V1.0, 1/13/97, CD",
{
{ "Obsidian Installer", 0, "1c272c23dc50b771970cabe8410c9349", 9250304 },
{ "Obsidian Data 2", 0, "1e590e3154c1af09efb951a07abc48b8", 563287808 },
@@ -52,8 +52,8 @@ static const MTropolisGameDescription gameDescriptions[] = {
0,
0,
},
- {
- // Obsidian Windows, installed
+
+ { // Obsidian Windows, installed
{
"obsidian",
"V1.0, 1/13/97, installed, CD",
@@ -108,9 +108,127 @@ static const MTropolisGameDescription gameDescriptions[] = {
0,
},
+ { // Obsidian Macintosh demo
+ {
+ "obsidian",
+ "Demo",
+ {
+ { "Obsidian Demo", 0, "abd1b5e7ac133f4c4b8c45ac67a4c44d", 920832 },
+ { "Basic.rPP", 0, "cb567ec1423a35903d8d5f458409e681", 210432 },
+ { "Experimental.rPP", 0, "26aa5fe1a6a152ade74e23a706673c50", 102016 },
+ { "Extras.rPP", 0, "c0e4c0401f2107ba3a3b7d282a76d99b", 377600 },
+ { "mCursors.cPP", 0, "a52e2aaf3b1a5c7d93a2949693bca694", 13312 },
+ { "mNet.rPP", 0, "ed5d998e7db6daae1f24bb124cc269aa", 134784 },
+ { "Obsidian.cPP", 0, "6da7babae9725a716f27f9f4ea382e92", 7552 },
+ { "RSGKit.rPP", 0, "c359e3c932b09280d1ccf21f8fb52bd7", 668160 },
+ { "Obs Demo Large w Sega", 0, "34efe95fc32dcf0a2a90bf6854c08e95", 98953679 },
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformMacintosh,
+ ADGF_DEMO,
+ GUIO0()
+ },
+ GID_OBSIDIAN,
+ 0,
+ 0,
+ },
+
+ { // Obsidian PC demo from PC Gamer Disc 2.12 (1997-01)
+ {
+ "obsidian",
+ "Demo",
+ {
+ { "OBSIDIAN.EXE", 0, "b6fb0e0df88c1524bcd0c5de9f5e882c", 750080 },
+ { "OBSIDIAN.R95", 0, "5361ef93e36d722665594b724e0018fd", 183296 },
+ { "TEXTWORK.R95", 0, "96346d39c4bb04f525edbf06ffe047e0", 148992 },
+ { "EXPRMNTL.R95", 0, "aa0431c2be37e33883747c61d3e980ff", 108544 },
+ { "MCURSORS.C95", 0, "47cf6abb95f3c43cdcbdf7ea1de3478d", 145920 },
+ { "OBSIDI~1.MPL", 0, "643a989213b42cbac319d04676447624", 29096880 },
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_DEMO | ADGF_UNSTABLE,
+ GUIO0()
+ },
+ GID_OBSIDIAN,
+ 0,
+ 0,
+ },
+
+ { // Obsidian PC demo
+ {
+ "obsidian",
+ "Demo",
+ {
+ { "OBSIDIAN DEMO.EXE", 0, "1bac38af354fd79ae3285e6c737705b7", 751104 },
+ { "OBSIDIAN1.R95", 0, "5361ef93e36d722665594b724e0018fd", 183296 },
+ { "OBSIDIAN2.R95", 0, "96346d39c4bb04f525edbf06ffe047e0", 148992 },
+ { "OBSIDIAN3.R95", 0, "aa0431c2be37e33883747c61d3e980ff", 108544 },
+ { "OBSIDIAN4.C95", 0, "47cf6abb95f3c43cdcbdf7ea1de3478d", 145920 },
+ { "OBSIDIAN DEMO DATA.MPL", 0, "77d04f62825c9f424baba46922ffb60f", 29552976 },
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_DEMO | ADGF_UNSTABLE,
+ GUIO0()
+ },
+ GID_OBSIDIAN,
+ 0,
+ 0,
+ },
+
+ { // Obsidian PC demo
+ {
+ "obsidian",
+ "Demo",
+ {
+ { "OBSIDIAN.EXE", 0, "b6fb0e0df88c1524bcd0c5de9f5e882c", 750080 },
+ { "OBSIDIAN.R95", 0, "5361ef93e36d722665594b724e0018fd", 183296 },
+ { "TEXTWORK.R95", 0, "96346d39c4bb04f525edbf06ffe047e0", 148992 },
+ { "EXPRMNTL.R95", 0, "aa0431c2be37e33883747c61d3e980ff", 108544 },
+ { "MCURSORS.C95", 0, "47cf6abb95f3c43cdcbdf7ea1de3478d", 145920 },
+ { "OBSIDIAN DEMO DATA.MPL", 0, "4d557cd0a5f2311685d213053ebbd567", 116947911 },
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_DEMO | ADGF_UNSTABLE,
+ GUIO0()
+ },
+ GID_OBSIDIAN,
+ 0,
+ 0,
+ },
+
+ { // Obsidian PC demo
+ {
+ "obsidian",
+ "Demo",
+ {
+ { "OBSIDIAN DEMO.EXE", 0, "1bac38af354fd79ae3285e6c737705b7", 751104 },
+ { "OBSIDIAN1.R95", 0, "5361ef93e36d722665594b724e0018fd", 183296 },
+ { "OBSIDIAN2.R95", 0, "96346d39c4bb04f525edbf06ffe047e0", 148992 },
+ { "OBSIDIAN3.R95", 0, "aa0431c2be37e33883747c61d3e980ff", 108544 },
+ { "OBSIDIAN4.C95", 0, "47cf6abb95f3c43cdcbdf7ea1de3478d", 145920 },
+ { "OBSIDIAN DEMO DATA.MPL", 0, "4d557cd0a5f2311685d213053ebbd567", 116947911 },
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_DEMO | ADGF_UNSTABLE,
+ GUIO0()
+ },
+ GID_OBSIDIAN,
+ 0,
+ 0,
+ },
+
{ AD_TABLE_END_MARKER, 0, 0, 0 }
};
-} // End of namespace MTropolisEngine
+} // End of namespace MTropolis
#endif
diff --git a/engines/mtropolis/mtropolis.cpp b/engines/mtropolis/mtropolis.cpp
index b249e1fdf7e..992375d6c95 100644
--- a/engines/mtropolis/mtropolis.cpp
+++ b/engines/mtropolis/mtropolis.cpp
@@ -172,6 +172,7 @@ struct MacObsidianResources : public ProjectResources {
~MacObsidianResources();
void setup(bool haveWordGames);
+ void setup_mac_demo();
Common::SeekableReadStream *getSegmentStream(int index) const;
const Common::SharedPtr<CursorGraphicCollection> &getCursorGraphics() const;
const Common::SharedPtr<Obsidian::WordGameData> &getWordGameData() const;
@@ -290,6 +291,65 @@ void MacObsidianResources::setup(bool haveWordGames) {
debug(1, "Finished unpacking installer resources");
}
+void MacObsidianResources::setup_mac_demo() {
+ debug(1, "Opening resources...");
+
+ const char *cursorSources[4] = {"Obsidian Demo", "Basic.rPP", "mCursors.cPP", "Obsidian.cPP"};
+ for (int i = 0; i < 4; i++) {
+ const char *fileName = cursorSources[i];
+
+ Common::MacResManager resMan;
+ if (!resMan.open(Common::Path(fileName)))
+ error("Failed to open resources in file '%s'", fileName);
+
+ if (!loadCursorsFromMacResources(*_cursorGraphics, resMan))
+ error("Failed to read cursor resources from file '%s'", fileName);
+ }
+ debug(1, "Loading word games...");
+
+ {
+ Common::MacResManager resMan;
+ if (!resMan.open(Common::Path("RSGKit.rPP")))
+ error("Couldn't find word game file in installer archive");
+
+ _wordGameData.reset(new Obsidian::WordGameData());
+
+ Common::SeekableReadStream *stream = resMan.getDataFork();
+ if (!stream)
+ error("Failed to open word game file");
+
+ Obsidian::WordGameLoadBucket buckets[] = {
+ {0, 0}, // 0 letters
+ {0xD7C8, 0xD7CC}, // 1 letter
+ {0xD7CC, 0xD84D}, // 2 letter
+ {0xD84D, 0xE25D}, // 3 letter
+ {0x1008C, 0x12AA8}, // 4 letter
+ {0x14C58, 0x19614}, // 5 letter
+ {0x1C73C, 0x230C1}, // 6 letter
+ {0x26D10, 0x2EB98}, // 7 letter
+ {0x32ADC, 0x3AA0E}, // 8 letter
+ {0x3E298, 0x45B88}, // 9 letter
+ {0x48BE8, 0x4E0D0}, // 10 letter
+ {0x4FFB0, 0x53460}, // 11 letter
+ {0x545F0, 0x56434}, // 12 letter
+ {0x56D84, 0x57CF0}, // 13 letter
+ {0x58158, 0x58833}, // 14 letter
+ {0x58A08, 0x58CD8}, // 15 letter
+ {0x58D8C, 0x58EAD}, // 16 letter
+ {0x58EF4, 0x58F72}, // 17 letter
+ {0x58F90, 0x58FDC}, // 18 letter
+ {0, 0}, // 19 letter
+ {0x58FEC, 0x59001}, // 20 letter
+ {0x59008, 0x59034}, // 21 letter
+ {0x5903C, 0x59053}, // 22 letter
+ };
+
+ if (!_wordGameData->load(stream, buckets, 23, 1, false))
+ error("Failed to load word game data");
+ }
+ debug(1, "Finished loading demo resources");
+}
+
Common::SeekableReadStream *MacObsidianResources::getSegmentStream(int index) const {
return _segmentStreams[index];
}
@@ -311,8 +371,9 @@ MacObsidianResources::~MacObsidianResources() {
}
MTropolisEngine::MTropolisEngine(OSystem *syst, const MTropolisGameDescription *gameDesc) : Engine(syst), _gameDescription(gameDesc) {
+ const Common::FSNode gameDataDir(ConfMan.get("path"));
+ SearchMan.addSubDirectoryMatching(gameDataDir, "Resource");
if (gameDesc->gameID == GID_OBSIDIAN && _gameDescription->desc.platform == Common::kPlatformWindows) {
- const Common::FSNode gameDataDir(ConfMan.get("path"));
SearchMan.addSubDirectoryMatching(gameDataDir, "Obsidian");
SearchMan.addSubDirectoryMatching(gameDataDir, "Obsidian/RESOURCE");
SearchMan.addSubDirectoryMatching(gameDataDir, "RESOURCE");
@@ -384,23 +445,52 @@ Common::Error MTropolisEngine::run() {
_runtime->addVolume(5, "OBSIDIAN5", true);
Common::SharedPtr<ProjectDescription> desc(new ProjectDescription(kProjectPlatformWindows));
- desc->addSegment(0, "Obsidian Data 1.MPL");
- desc->addSegment(1, "Obsidian Data 2.MPX");
- desc->addSegment(2, "Obsidian Data 3.MPX");
- desc->addSegment(3, "Obsidian Data 4.MPX");
- desc->addSegment(4, "Obsidian Data 5.MPX");
- desc->addSegment(5, "Obsidian Data 6.MPX");
+
+ if (_gameDescription->desc.flags & ADGF_DEMO) {
+ if (Common::File::exists("OBSIDI~1.MPL")) {
+ desc->addSegment(0, "OBSIDI~1.MPL");
+ } else {
+ desc->addSegment(0, "OBSIDIAN DEMO DATA.MPL");
+ }
+ } else {
+ desc->addSegment(0, "Obsidian Data 1.MPL");
+ desc->addSegment(1, "Obsidian Data 2.MPX");
+ desc->addSegment(2, "Obsidian Data 3.MPX");
+ desc->addSegment(3, "Obsidian Data 4.MPX");
+ desc->addSegment(4, "Obsidian Data 5.MPX");
+ desc->addSegment(5, "Obsidian Data 6.MPX");
+
+ Common::SharedPtr<Obsidian::WordGameData> wgData = loadWinObsidianWordGameData();
+ desc->addPlugIn(PlugIns::createObsidian(wgData));
+ }
Common::SharedPtr<CursorGraphicCollection> cursors(new CursorGraphicCollection());
{
+ const char *cursorSources[3];
// Has to be in this order, some resources from MCURSORS will clobber resources from the player executable
- const char *cursorFiles[3] = {"Obsidian.exe", "MCURSORS.C95", "Obsidian.c95"};
+ if (Common::File::exists("OBSIDIAN4.C95")) {
+ cursorSources[1] = "OBSIDIAN4.C95";
+ } else {
+ cursorSources[1] = "MCURSORS.C95";
+ }
- for (int i = 0; i < 3; i++) {
+ if (Common::File::exists("OBSIDIAN DEMO.EXE")) {
+ cursorSources[0] = "OBSIDIAN DEMO.EXE";
+ } else {
+ cursorSources[0] = "OBSIDIAN.EXE";
+ }
+ if (!(_gameDescription->desc.flags & ADGF_DEMO)) {
+ cursorSources[2] = "Obsidian.c95";
+ }
+
+ for (int i = 0; i < (_gameDescription->desc.flags & ADGF_DEMO ? 2 : 3); i++) {
+ const char *fileName = cursorSources[i];
Common::File f;
- if (!f.open(cursorFiles[i]) || !loadCursorsFromPE(*cursors, &f)) {
- error("Failed to load resources");
- }
+ if (!f.open(Common::Path(fileName)))
+ error("Failed to open resources in file '%s'", fileName);
+
+ if (!loadCursorsFromPE(*cursors, &f))
+ error("Failed to read cursor resources from file '%s'", fileName);
}
}
@@ -416,8 +506,6 @@ Common::Error MTropolisEngine::run() {
static_cast<Standard::StandardPlugIn *>(standardPlugIn.get())->getHacks().allowGarbledListModData = true;
desc->addPlugIn(standardPlugIn);
- desc->addPlugIn(PlugIns::createObsidian(wgData));
-
_runtime->queueProject(desc);
} else if (_gameDescription->gameID == GID_OBSIDIAN && _gameDescription->desc.platform == Common::kPlatformMacintosh) {
@@ -431,9 +519,6 @@ Common::Error MTropolisEngine::run() {
MacObsidianResources *resources = new MacObsidianResources();
Common::SharedPtr<ProjectResources> resPtr(resources);
- // Non-English releases don't have Bureau word game puzzles
- resources->setup(_gameDescription->desc.language == Common::Language::EN_ANY);
-
_runtime->addVolume(0, "Installed", true);
_runtime->addVolume(1, "OBSIDIAN1", true);
_runtime->addVolume(2, "OBSIDIAN2", true);
@@ -443,8 +528,18 @@ Common::Error MTropolisEngine::run() {
Common::SharedPtr<ProjectDescription> desc(new ProjectDescription(kProjectPlatformMacintosh));
- for (int i = 0; i < 6; i++)
- desc->addSegment(i, resources->getSegmentStream(i));
+ if (_gameDescription->desc.flags & ADGF_DEMO) {
+ resources->setup_mac_demo();
+
+ desc->addSegment(0, "Obs Demo Large w Sega");
+ } else {
+ // Non-English releases don't have Bureau word game puzzles
+ resources->setup(_gameDescription->desc.language == Common::Language::EN_ANY);
+
+ for (int i = 0; i < 6; i++)
+ desc->addSegment(i, resources->getSegmentStream(i));
+ }
+
Common::SharedPtr<MTropolis::PlugIn> standardPlugIn = PlugIns::createStandard();
static_cast<Standard::StandardPlugIn *>(standardPlugIn.get())->getHacks().allowGarbledListModData = true;
More information about the Scummvm-git-logs
mailing list