[Scummvm-cvs-logs] SF.net SVN: scummvm:[43756] scummvm/trunk/engines/sci/detection.cpp

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Wed Aug 26 12:01:05 CEST 2009


Revision: 43756
          http://scummvm.svn.sourceforge.net/scummvm/?rev=43756&view=rev
Author:   thebluegr
Date:     2009-08-26 10:01:05 +0000 (Wed, 26 Aug 2009)

Log Message:
-----------
Further work on the fallback detector: added several demos

Modified Paths:
--------------
    scummvm/trunk/engines/sci/detection.cpp

Modified: scummvm/trunk/engines/sci/detection.cpp
===================================================================
--- scummvm/trunk/engines/sci/detection.cpp	2009-08-26 09:38:51 UTC (rev 43755)
+++ scummvm/trunk/engines/sci/detection.cpp	2009-08-26 10:01:05 UTC (rev 43756)
@@ -68,7 +68,6 @@
 	{"lsl6",            "Leisure Suit Larry 6: Shape Up or Slip Out!"},
 	{"lslcasino",       "Crazy Nick's Software Picks: Leisure Suit Larry's Casino"},
 	{"fairytales",      "Mixed-up Fairy Tales"},
-	{"gk1",             "Gabriel Knight: Sins of the Fathers"},	// demo is SCI11, full version SCI32
 	{"mothergoose",     "Mixed-Up Mother Goose"},
 	{"msastrochicken",  "Ms. Astro Chicken"},
 	{"pepper",          "Pepper's Adventure in Time"},
@@ -84,7 +83,8 @@
 	{"sq4",             "Space Quest IV: Roger Wilco and the Time Rippers"},
 	{"sq5",             "Space Quest V: The Next Mutation"},
 	{"islandbrain",     "The Island of Dr. Brain"},
-#ifdef ENABLE_SCI32
+	// SCI32 games
+	{"gk1",             "Gabriel Knight: Sins of the Fathers"},	// demo is SCI11, full version SCI32
 	{"gk2",             "The Beast Within: A Gabriel Knight Mystery"},
 	{"kq7",             "King's Quest VII: The Princeless Bride"},
 	{"lsl7",            "Leisure Suit Larry 7: Love for Sail!"},
@@ -99,7 +99,6 @@
 	{"shivers2",        "Shivers II: Harvest of Souls"},
 	{"sq6",             "Space Quest 6: The Spinal Frontier"},
 	{"torin",           "Torin's Passage"},
-#endif // ENABLE_SCI32
 	{0, 0}
 };
 
@@ -164,7 +163,7 @@
 	const ADGameDescription *fallbackDetect(const Common::FSList &fslist) const;
 };
 
-Common::String convertSierraGameId(Common::String sierraId) {
+Common::String convertSierraGameId(Common::String sierraId, uint32 *gameFlags) {
 	// TODO: SCI32 IDs
 
 	if (sierraId == "demo")
@@ -175,68 +174,125 @@
 		// christmas1992 has a "resource.000" file
 		return (Common::File::exists("resource.001")) ? "christmas1990" : "christmas1992";
 	}
-	if (sierraId == "arthur")
+	if (sierraId == "arthur") {
+		if (!Common::File::exists("resource.002"))
+			*gameFlags |= ADGF_DEMO;
 		return "camelot";
+	}
 	if (sierraId == "brain") {
 		// This could either be The Castle of Dr. Brain, or The Island of Dr. Brain
 		// castlebrain has resource.001, whereas islandbrain doesn't
 		return (Common::File::exists("resource.001")) ? "castlebrain" : "islandbrain";
 	}
 	// iceman is the same
+	if (sierraId == "icedemo") {
+		*gameFlags |= ADGF_DEMO;
+		return "iceman";
+	}
 	// longbow is the same
+	if (sierraId == "rh") {	// Longbow demo
+		*gameFlags |= ADGF_DEMO;
+		return "longbow";
+	}
 	if (sierraId == "eco")
 		return "ecoquest";
-	if (sierraId == "eco2")	// EcoQuest 2 demo
+	if (sierraId == "eco2")	{ // EcoQuest 2 demo
+		*gameFlags |= ADGF_DEMO;
 		return "ecoquest2";
+	}
 	if (sierraId == "rain")	// EcoQuest 2 full
 		return "ecoquest2";
 	if (sierraId == "fp")
 		return "freddypharkas";
 	if (sierraId == "emc")
 		return "funseeker";
+	if (sierraId == "gk")
+		return "gk1";
+	if (sierraId == "hoyledemo") {
+		*gameFlags |= ADGF_DEMO;
+		return "hoyle1";
+	}
 	if (sierraId == "cardgames")
 		return "hoyle1";
-	if (sierraId == "gk")
-		return "gk1";
 	if (sierraId == "solitare")
 		return "hoyle2";
 	// hoyle3 is the same
 	// hoyle4 is the same
+	if (sierraId == "demo000") {
+		*gameFlags |= ADGF_DEMO;
+		return "kq1sci";
+	}
 	if (sierraId == "kq1")
 		return "kq1sci";
 	if (sierraId == "kq4")
 		return "kq4sci";
+	if (sierraId == "ll1") {
+		*gameFlags |= ADGF_DEMO;
+		return "lsl1sci";
+	}
 	if (sierraId == "lsl1")
 		return "lsl1sci";
 	// lsl2 is the same
-	// lsl3 is the same
+	if (sierraId == "lsl3") {
+		if (!Common::File::exists("resource.003"))
+			*gameFlags |= ADGF_DEMO;
+		return "lsl3";
+	}
+	if (sierraId == "ll5") {
+		*gameFlags |= ADGF_DEMO;
+		return "lsl5";
+	}
 	// lsl5 is the same
 	// lsl6 is the same
 	// TODO: lslcasino
-	if (sierraId == "tales")
+	if (sierraId == "tales") {
+		if (!Common::File::exists("resource.002"))
+			*gameFlags |= ADGF_DEMO;
 		return "fairytales";
+	}
 	if (sierraId == "mg")
 		return "mothergoose";
 	if (sierraId == "cb1")
 		return "laurabow";
 	if (sierraId == "lb2")
 		return "laurabow2";
-	// TODO: lb2 floppy (its resources can't be read)
 	if (sierraId == "twisty")
 		return "pepper";
 	// TODO: pq1sci (its resources can't be read)
 	if (sierraId == "pq")
 		return "pq2";
-	// pq3 is the same
-	if (sierraId == "glory")
-		return "qfg1";
+	if (sierraId == "pq3") {
+		// The pq3 demo comes with resource.000 and resource.001
+		// The full version was released with several resource.* files,
+		// or one big resource.000 file
+		if (Common::File::exists("resource.000") && Common::File::exists("resource.001") &&
+			!Common::File::exists("resource.002"))
+			*gameFlags |= ADGF_DEMO;
+		return "pq3";
+	}
+	if (sierraId == "glory" || sierraId == "hq") {
+		// This could either be qfg1 or qfg3 or qfg4
+		// qfg3 has resource.aud, qfg4 has resource.sfx
+		if (Common::File::exists("resource.aud"))
+			return "qfg3";
+		else if (Common::File::exists("resource.sfx"))
+			return "qfg4";
+		else
+			return "qfg1";
+	}
 	// TODO: qfg1 VGA (its resources can't be read)
 	if (sierraId == "trial")
 		return "qfg2";
-	if (sierraId == "qfg1")
-		return "qfg3";
+	if (sierraId == "hq2demo") {
+		*gameFlags |= ADGF_DEMO;
+		return "qfg2";
+	}
 	if (sierraId == "thegame")
 		return "slater";
+	if (sierraId == "sq1demo") {
+		*gameFlags |= ADGF_DEMO;
+		return "sq1sci";
+	}
 	if (sierraId == "sq1")
 		return "sq1sci";
 	if (sierraId == "sq3") {
@@ -254,7 +310,6 @@
 		// the subgame)
 		return (Common::File::exists("resource.000")) ? "sq4" : "msastrochicken";
 	}
-	// sq4 is the same
 	// sq5 is the same
 
 	return sierraId;
@@ -283,6 +338,9 @@
 const ADGameDescription *SciMetaEngine::fallbackDetect(const Common::FSList &fslist) const {
 	bool foundResMap = false;
 	bool foundRes000 = false;
+	// This flag is used to determine if the size of resource.000 is less than 1MB, to distinguish
+	// between full and demo versions
+	bool smallResource000Size = false;
 
 	// Set some defaults
 	s_fallbackDesc.desc.extra = "";
@@ -317,10 +375,11 @@
 		}
 
 		// Determine if we got a CD version and set the CD flag accordingly, by checking for
-		// resource.aud. We assume that the file should be over 10MB, as it contains all the
-		// game speech and is usually around 450MB+. The size check is for some floppy game
-		// versions like KQ6 floppy, which also have a small resource.aud file
-		if (filename.contains("resource.aud")) {
+		// resource.aud for SCI1.1 CD games, or audio001.002 for SCI1 CD games. We assume that
+		// the file should be over 10MB, as it contains all the game speech and is usually
+		// around 450MB+. The size check is for some floppy game versions like KQ6 floppy, which
+		// also have a small resource.aud file
+		if (filename.contains("resource.aud") || filename.contains("audio001.002")) {
 			Common::SeekableReadStream *tmpStream = file->createReadStream();
 			if (tmpStream->size() > 10 * 1024 * 1024) {
 				// We got a CD version, so set the CD flag accordingly
@@ -330,12 +389,11 @@
 			delete tmpStream;
 		}
 
-		// Check if we got a map file for older SCI1 CD versions (like KQ5CD)
-		// It's named like "audioXXX.map"
-		if (filename.contains("audio") && filename.contains(".map")) {
-			// We got a CD version, so set the CD flag accordingly
-			s_fallbackDesc.desc.flags |= ADGF_CD;
-			s_fallbackDesc.desc.extra = "CD";
+		if (filename.contains("resource.000")) {
+			Common::SeekableReadStream *tmpStream = file->createReadStream();
+			if (tmpStream->size() < 1 * 1024 * 1024)
+				smallResource000Size = true;
+			delete tmpStream;
 		}
 
 		if (filename.contains("resource.000") || filename.contains("resource.001")
@@ -382,7 +440,7 @@
 #endif
 
 	// EGA views
-	if (gameViews == kViewEga)
+	if (gameViews == kViewEga && s_fallbackDesc.desc.platform != Common::kPlatformAmiga)
 		s_fallbackDesc.desc.extra = "EGA";
 
 	// Set the platform to Amiga if the game is using Amiga views
@@ -402,7 +460,7 @@
 	Common::String gameName = obj_get_name(segManager, game_obj);
 	debug(2, "Detected ID: \"%s\" at %04x:%04x", gameName.c_str(), PRINT_REG(game_obj));
 	gameName.toLowercase();
-	s_fallbackDesc.desc.gameid = strdup(convertSierraGameId(gameName).c_str());
+	s_fallbackDesc.desc.gameid = strdup(convertSierraGameId(gameName, &s_fallbackDesc.desc.flags).c_str());
 	delete segManager;
 
 	// Try to determine the game language
@@ -411,8 +469,9 @@
 	// Where XXXX is the English string, #Y a separator indicating the language
 	// (e.g. #G for German) and ZZZZ is the translated text
 	// NOTE: This doesn't work for games which use message instead of text resources
-	// (like, for example, Eco Quest 1). As far as we know, these games store the messages
-	// of each language in separate resources, and it's not possible to detect that easily
+	// (like, for example, Eco Quest 1 and all SCI1.1 games and newer, e.g. Freddy Pharkas). 
+	// As far as we know, these games store the messages of each language in separate
+	// resources, and it's not possible to detect that easily
 	Resource *text = resourceManager->findResource(ResourceId(kResourceTypeText, 0), 0);
 	uint seeker = 0;
 	if (text) {
@@ -428,18 +487,17 @@
 	delete resourceManager;
 
 	// Distinguish demos from full versions
-	if (!strcmp(s_fallbackDesc.desc.gameid, "camelot") && !Common::File::exists("resource.002"))
-		s_fallbackDesc.desc.flags |= ADGF_DEMO;
-
 	if (!strcmp(s_fallbackDesc.desc.gameid, "castlebrain") && !Common::File::exists("resource.002")) {
-		if (s_fallbackDesc.desc.language != Common::ES_ESP)	// the Spanish version doesn't have resource.002
+		// The Spanish full version doesn't have resource.002, but we can distinguish it from the
+		// demo from the size of resource.000
+		if (smallResource000Size)
 			s_fallbackDesc.desc.flags |= ADGF_DEMO;
 	}
 
-	if (!strcmp(s_fallbackDesc.desc.gameid, "ecoquest2") && !Common::File::exists("resource.aud"))
+	if (!strcmp(s_fallbackDesc.desc.gameid, "islandbrain") && smallResource000Size)
 		s_fallbackDesc.desc.flags |= ADGF_DEMO;
 
-	if (!strcmp(s_fallbackDesc.desc.gameid, "fairytales") && !Common::File::exists("resource.002"))
+	if (!strcmp(s_fallbackDesc.desc.gameid, "kq6") && smallResource000Size)
 		s_fallbackDesc.desc.flags |= ADGF_DEMO;
 
 	SearchMan.remove("SCI_detection");


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list