[Scummvm-cvs-logs] CVS: scummvm/sword1 logic.cpp,1.46,1.47 sword1.cpp,1.72,1.73 sword1.h,1.22,1.23 sworddefs.h,1.16,1.17

Robert Göffringmann lavosspawn at users.sourceforge.net
Fri Dec 10 09:56:05 CET 2004


Update of /cvsroot/scummvm/scummvm/sword1
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31096/sword1

Modified Files:
	logic.cpp sword1.cpp sword1.h sworddefs.h 
Log Message:
changed cd checking code, gives warnings about everything now.

Index: logic.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword1/logic.cpp,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -d -r1.46 -r1.47
--- logic.cpp	10 Dec 2004 00:25:29 -0000	1.46
+++ logic.cpp	10 Dec 2004 17:55:03 -0000	1.47
@@ -74,6 +74,8 @@
 	memset(_scriptVars, 0, NUM_SCRIPT_VARS * sizeof(uint32));
 	for (uint8 cnt = 0; cnt < NON_ZERO_SCRIPT_VARS; cnt++)
 		_scriptVars[_scriptVarInit[cnt][0]] = _scriptVarInit[cnt][1];
+	if (SwordEngine::_systemVars.isDemo)
+		_scriptVars[PLAYINGDEMO] = 1;
 	
 	delete _eventMan;
 	_eventMan = new EventManager();

Index: sword1.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword1/sword1.cpp,v
retrieving revision 1.72
retrieving revision 1.73
diff -u -d -r1.72 -r1.73
--- sword1.cpp	10 Dec 2004 15:10:10 -0000	1.72
+++ sword1.cpp	10 Dec 2004 17:55:03 -0000	1.73
@@ -158,6 +158,8 @@
 		_system->initSize(640, 480);
 	_system->endGFXTransaction();
 
+	checkCdFiles();
+
 	debug(5, "Starting resource manager");
 	_resMan = new ResMan("swordres.rif");
 	debug(5, "Starting object manager");
@@ -235,61 +237,185 @@
 	_systemVars.wantFade = true;
 }
 
-void SwordEngine::checkCdFiles(void) { // check if we're running from cd, hdd or what...
-	const char *speechFiles[] = {
+void SwordEngine::flagsToBool(bool *dest, uint8 flags) {
+	uint8 bitPos = 0;
+	while (flags) {
+		if (flags & 1)
+			dest[bitPos] = true;
+		flags >>= 1;
+		bitPos++;
+	}
+}
+
+static const char *errorMsgs[] = {
+	"The file \"%s\" is missing and the game doesn't work without it.\n"
+	"Please copy it from CD %d and try starting the game again.\n"
+	"The Readme file also contains further information.",
+	
+	"%d important files are missing, the game can't start without them.\n"
+	"Please copy these files from their corresponding CDs:\n",
+
+    "The file \"%s\" is missing.\n"
+	"Even though the game may initially seem to\n"
+	"work fine, it will crash when it needs the\n"
+	"data from this file and you will be thrown back to your last savegame.\n"
+	"Please copy the file from CD %d and start the game again.",
+
+	"%d files are missing.\n"
+	"Even though the game may initially seem to\n"
+	"work fine, it will crash when it needs the\n"
+	"data from these files and you will be thrown back to your last savegame.\n"
+	"Please copy these files from their corresponding CDs:\n"
+};
+
+const CdFile SwordEngine::_cdFileList[] = {
+	{ "paris2.clu", FLAG_CD1 },
+	{ "ireland.clu", FLAG_CD2 },
+	{ "paris3.clu", FLAG_CD1 },
+	{ "paris4.clu", FLAG_CD1 },
+	{ "scotland.clu", FLAG_CD2 },
+	{ "spain.clu", FLAG_CD2 },
+	{ "syria.clu", FLAG_CD2 },
+	{ "train.clu", FLAG_CD2 },
+	{ "compacts.clu", FLAG_CD1 | FLAG_DEMO | FLAG_IMMED },
+	{ "general.clu", FLAG_CD1 | FLAG_DEMO | FLAG_IMMED },
+	{ "maps.clu", FLAG_CD1 | FLAG_DEMO },
+	{ "paris1.clu", FLAG_CD1 | FLAG_DEMO },
+	{ "scripts.clu", FLAG_CD1 | FLAG_DEMO | FLAG_IMMED },
+	{ "swordres.rif", FLAG_CD1 | FLAG_DEMO | FLAG_IMMED },
+	{ "text.clu", FLAG_CD1 | FLAG_DEMO },
+	{ "cows.mad", FLAG_DEMO },
+	{ "speech1.clu", FLAG_SPEECH1 },
+	 { "speech2.clu", FLAG_SPEECH2 }
 #ifdef USE_MAD
-		"SPEECH%d.CL3",
+	,{ "speech1.cl3", FLAG_SPEECH1 },
+	 { "speech2.cl3", FLAG_SPEECH2 }
 #endif
 #ifdef USE_VORBIS
-		"SPEECH%d.CLV",
+	,{ "speech1.clv", FLAG_SPEECH1 },
+	 { "speech2.clv", FLAG_SPEECH2 }
 #endif
-		"SPEECH%d.CLU"
-	};
-	bool fileFound[2] = { false, false };
-	File test;
-
-	_systemVars.playSpeech = true;
-	_systemVars.isDemo = false;
+};
 
-	for (int i = 1; i <= 2; i++) {
-		for (int j = 0; j < ARRAYSIZE(speechFiles); j++) {
-			char fileName[12];
-			sprintf(fileName, speechFiles[j], i);
-			if (test.open(fileName)) {
-				test.close();
-				fileFound[i - 1] = true;
-				break;
-			}
+void SwordEngine::showFileErrorMsg(uint8 type, bool *fileExists) {
+	char msg[1024];
+	int missCnt = 0, missNum = 0;
+	for (int i = 0; i < ARRAYSIZE(_cdFileList); i++)
+		if (!fileExists[i]) {
+			missCnt++;
+			missNum = i;
 		}
+	assert(missCnt > 0); // this function shouldn't get called if there's nothing missing.
+	warning("%d files missing", missCnt);
+	int msgId = (type == TYPE_IMMED) ? 0 : 2;
+	if (missCnt == 1) {
+		sprintf(msg, errorMsgs[msgId],
+				_cdFileList[missNum].name, (_cdFileList[missNum].flags & FLAG_CD2) ? 2 : 1);
+		warning(msg);
+	} else {
+		char *pos = msg + sprintf(msg, errorMsgs[msgId + 1], missCnt);
+		warning(msg);
+		for (int i = 0; i < ARRAYSIZE(_cdFileList); i++)
+			if (!fileExists[i]) {
+				warning("\"%s\" (CD %d)", _cdFileList[i].name, (_cdFileList[i].flags & FLAG_CD2) ? 2 : 1);
+				pos += sprintf(pos, "\"%s\" (CD %d)\n", _cdFileList[i].name, (_cdFileList[i].flags & FLAG_CD2) ? 2 : 1);
+			}
 	}
+	GUI::MessageDialog dialog(msg);
+	dialog.runModal();
+	if (type == TYPE_IMMED) // we can't start without this file, so error() out.
+		error(msg);
+}
 
-	if (fileFound[0] && fileFound[1]) {
-		// both files exist, assume running from HDD and everything's fine.
-		_systemVars.runningFromCd = false;
-		_systemVars.playSpeech = true;
-	} else { // speech1 & speech2 not present. are we running from cd?
-		if (test.open("cows.mad")) {
-			_systemVars.isDemo = true;
-			Logic::_scriptVars[PLAYINGDEMO] = 1;
-			test.close();
-		}
-		if (test.open("cd1.id")) {
-			_systemVars.runningFromCd = true;
-			_systemVars.currentCD = 1;
-			test.close();
-		} else if (test.open("cd2.id")) {
-			_systemVars.runningFromCd = true;
-			_systemVars.currentCD = 2;
+void SwordEngine::checkCdFiles(void) { // check if we're running from cd, hdd or what...
+	File test;
+	bool fileExists[30];
+	bool isFullVersion = false; // default to demo version
+	bool missingTypes[8] = { false, false, false, false, false, false, false, false };
+	bool foundTypes[8] = { false, false, false, false, false, false, false, false };
+	bool cd2FilesFound = false;
+	_systemVars.runningFromCd = false;
+	_systemVars.playSpeech = true;
+
+	// check all files and look out if we can find a file that wouldn't exist if this was the demo version
+	for (int fcnt = 0; fcnt < ARRAYSIZE(_cdFileList); fcnt++) {
+		if (test.open(_cdFileList[fcnt].name)) {
 			test.close();
+			fileExists[fcnt] = true;
+			flagsToBool(foundTypes, _cdFileList[fcnt].flags);
+			if (!(_cdFileList[fcnt].flags & FLAG_DEMO))
+				isFullVersion = true;
+			if (_cdFileList[fcnt].flags & FLAG_CD2)
+				cd2FilesFound = true;
 		} else {
-			const char msg[] = "Unable to find the game files.\nPlease read the ScummVM documentation";
-			GUI::MessageDialog dialog(msg);
-			dialog.runModal();
-			error(msg);
+			flagsToBool(missingTypes, _cdFileList[fcnt].flags);
+			fileExists[fcnt] = false;
 		}
 	}
 
-	// check cutscene pack version
+	if (((_features & GF_DEMO) == 0) != isFullVersion) // shouldn't happen...
+		warning("Your Broken Sword 1 version looks like a %s version but you are starting it as a %s version", isFullVersion ? "full" : "demo", (_features & GF_DEMO) ? "demo" : "full");
+	
+	if (foundTypes[TYPE_SPEECH1]) // we found some kind of speech1 file (.clu, .cl3, .clv)
+		missingTypes[TYPE_SPEECH1] = false; // so we don't care if there's a different kind missing
+	if (foundTypes[TYPE_SPEECH2]) // same for speech2
+		missingTypes[TYPE_SPEECH2] = false;
+
+	if (isFullVersion)					 // if this is the full version...
+		missingTypes[TYPE_DEMO] = false; // then we don't need demo files...
+	else								 // and vice versa
+		missingTypes[TYPE_SPEECH1] = missingTypes[TYPE_SPEECH2] = missingTypes[TYPE_CD1] = missingTypes[TYPE_CD2] = false;
+
+	bool somethingMissing = false;
+	for (int i = 0; i < 8; i++)
+		somethingMissing |= missingTypes[i];
+	if (somethingMissing) { // okay, there *are* files missing
+		// first, update the fileExists[] array depending on our changed missingTypes
+		for (int fileCnt = 0; fileCnt < ARRAYSIZE(_cdFileList); fileCnt++)
+			if (!fileExists[fileCnt]) {
+				fileExists[fileCnt] = true;
+				for (int flagCnt = 0; flagCnt < 8; flagCnt++)
+					if (missingTypes[flagCnt] && ((_cdFileList[fileCnt].flags & (1 << flagCnt)) != 0))
+						fileExists[fileCnt] = false; // this is one of the files we were looking for
+			}
+		if (missingTypes[TYPE_IMMED]) { 
+			// important files missing, can't start the game without them
+			showFileErrorMsg(TYPE_IMMED, fileExists);
+		} else if ((!missingTypes[TYPE_CD1]) && !cd2FilesFound) {
+			/* we have all the data from cd one, but not a single one from CD2.
+				I'm not sure how we should handle this, for now I'll just assume that the
+				user has set up the extrapath correctly and copied the necessary files to HDD.
+				A quite optimistic assumption, I'd say. Maybe we should change this for the release
+				to warn the user? */
+			warning("CD2 data files not found. I hope you know what you're doing and that\n"
+					"you have set up the extrapath and additional data correctly.\n"
+					"If you didn't, you should better read the ScummVM readme file");
+			_systemVars.runningFromCd = true;
+			_systemVars.playSpeech = true;
+		} else if (missingTypes[TYPE_CD1] || missingTypes[TYPE_CD2]) {
+			// several files from CD1 both CDs are missing. we can probably start, but it'll crash sooner or later
+			showFileErrorMsg(TYPE_CD1, fileExists);
+		} else if (missingTypes[TYPE_SPEECH1] || missingTypes[TYPE_SPEECH2]) {
+			// not so important, but there won't be any voices
+			if (missingTypes[TYPE_SPEECH1] && missingTypes[TYPE_SPEECH2])
+				warning("Unable to find the speech files. The game will work, but you won't hear any voice output.\n"
+						"Please copy the SPEECH.CLU files from both CDs and rename them to SPEECH1.CLU and SPEECH2.CLU,\n"
+						"corresponding to the CD number.\n",
+						"Please read the ScummVM Readme file for more information");
+			else
+				warning("Unable to find the speech file from CD %d.\n"
+						"You won't hear any voice output in that part of the game.\n"
+						"Please read the ScummVM Readme file for more information", missingTypes[TYPE_SPEECH1] ? 1 : 2);
+		} else if (missingTypes[TYPE_DEMO]) {
+			// for the demo version, we simply expect to have all files immediately
+			showFileErrorMsg(TYPE_IMMED, fileExists);
+		}
+	} // everything's fine, let's play.
+	/*if (!isFullVersion)
+		_systemVars.isDemo = true;
+	*/
+	// make the demo flag depend on the Gamesettings for now, and not on what the datafiles look like
+	_systemVars.isDemo = (_features & GF_DEMO) != 0;
 	_systemVars.cutscenePackVersion = 0;
 #ifdef USE_MPEG2
 	if (test.open("intro.snd")) {
@@ -300,8 +426,6 @@
 }
 
 int SwordEngine::go() {
-	
-	checkCdFiles();
 
 	uint16 startPos = ConfMan.getInt("boot_param");
 	if (startPos)

Index: sword1.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword1/sword1.h,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- sword1.h	8 Dec 2004 04:38:39 -0000	1.22
+++ sword1.h	10 Dec 2004 17:55:03 -0000	1.23
@@ -84,6 +84,8 @@
 
 	void checkCdFiles(void);
 	void checkCd(void);
+	void showFileErrorMsg(uint8 type, bool *fileExists);
+	void flagsToBool(bool *dest, uint8 flags);
 	uint8 mainLoop(void);
 
 	uint16 _mouseX, _mouseY, _mouseState;
@@ -98,7 +100,8 @@
 	Menu		*_menu;
 	Music		*_music;
 	Control		*_control;
-	static const uint8 _cdList[TOTAL_SECTIONS];
+	static const uint8  _cdList[TOTAL_SECTIONS];
+	static const CdFile	_cdFileList[];
 };
 
 } // End of namespace Sword1

Index: sworddefs.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword1/sworddefs.h,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- sworddefs.h	8 Dec 2004 04:38:39 -0000	1.16
+++ sworddefs.h	10 Dec 2004 17:55:03 -0000	1.17
@@ -116,6 +116,29 @@
 	#pragma END_PACK_STRUCTS
 #endif
 
+enum fileTypes {
+	TYPE_CD1 = 0,
+	TYPE_CD2,
+	TYPE_DEMO,
+	TYPE_IMMED,
+	TYPE_SPEECH1,
+	TYPE_SPEECH2
+};
+
+enum fileFlags {
+	FLAG_CD1 =		(1 << TYPE_CD1),	  // this file is on cd1
+	FLAG_CD2 =		(1 << TYPE_CD2),	  // this file is on cd2
+	FLAG_DEMO =		(1 << TYPE_DEMO),	  // file for the demo version
+	FLAG_IMMED =	(1 << TYPE_IMMED),	  // this file is needed immediately, game won't start without it
+	FLAG_SPEECH1 =	(1 << TYPE_SPEECH1),
+	FLAG_SPEECH2 =	(1 << TYPE_SPEECH2)
+};
+
+struct CdFile {
+	char *name;
+	uint8 flags;
+};
+
 enum Language {
 	BS1_ENGLISH = 0,
 	BS1_FRENCH,





More information about the Scummvm-git-logs mailing list