(svn r1702) - Fix: [ 1110407 ] Game does not crash any more when a newgrf file doesn't exist
authordominik
Fri, 28 Jan 2005 08:56:43 +0000
changeset 1198 010e5986ed74
parent 1197 4322cf8d6ae7
child 1199 15d0c3424a45
(svn r1702) - Fix: [ 1110407 ] Game does not crash any more when a newgrf file doesn't exist
fileio.c
fileio.h
spritecache.c
--- a/fileio.c	Thu Jan 27 21:18:03 2005 +0000
+++ b/fileio.c	Fri Jan 28 08:56:43 2005 +0000
@@ -100,6 +100,42 @@
 		FioCloseFile(i);
 }
 
+bool FiosCheckFileExists(const char *filename)
+{
+	FILE *f;
+	char buf[MAX_PATH];
+
+	sprintf(buf, "%s%s", _path.data_dir, filename);
+
+	f = fopen(buf, "rb");
+#if !defined(WIN32)
+	if (f == NULL) {
+		char *s;
+		// Make lower case and try again
+		for(s=buf + strlen(_path.data_dir) - 1; *s != 0; s++)
+			*s = tolower(*s);
+		f = fopen(buf, "rb");
+
+#if defined SECOND_DATA_DIR
+	// tries in the 2nd data directory
+		if (f == NULL) {
+			sprintf(buf, "%s%s", _path.second_data_dir, filename);
+			for(s=buf + strlen(_path.second_data_dir) - 1; *s != 0; s++)
+			*s = tolower(*s);
+		f = fopen(buf, "rb");
+		}
+#endif
+	}
+#endif
+
+	if (f == NULL)
+		return false;
+	else {
+		fclose(f);
+		return true;
+	}
+}
+
 void FioOpenFile(int slot, const char *filename)
 {
 	FILE *f;
--- a/fileio.h	Thu Jan 27 21:18:03 2005 +0000
+++ b/fileio.h	Fri Jan 28 08:56:43 2005 +0000
@@ -11,5 +11,6 @@
 void FioOpenFile(int slot, const char *filename);
 void FioReadBlock(void *ptr, uint size);
 void FioSkipBytes(int n);
+bool FiosCheckFileExists(const char *filename);
 
 #endif /* FILEIO_H */
--- a/spritecache.c	Thu Jan 27 21:18:03 2005 +0000
+++ b/spritecache.c	Fri Jan 28 08:56:43 2005 +0000
@@ -893,21 +893,18 @@
 
 
 		/* Load newgrf sprites */
-
+		// in each loading stage, (try to) open each file specified in the config and load information from it.
 		_custom_sprites_base = load_index;
-
-		_loading_stage = 0;
-		for (j = 0; j != lengthof(_newgrf_files) && _newgrf_files[j]; j++) {
-			InitNewGRFFile(_newgrf_files[j], load_index);
-			load_index += LoadNewGrfFile(_newgrf_files[j], load_index, i++);
+		for (_loading_stage = 0; _loading_stage < 2; _loading_stage++) {
+			for (j = 0; j != lengthof(_newgrf_files) && _newgrf_files[j]; j++) {
+				if ( !FiosCheckFileExists(_newgrf_files[j]) )
+					continue;
+				if (_loading_stage == 0)
+					InitNewGRFFile(_newgrf_files[j], load_index);
+				load_index += LoadNewGrfFile(_newgrf_files[j], load_index, i++);
+			}
 		}
 
-		_loading_stage = 1;
-		load_index = _custom_sprites_base;
-		for (j = 0; j != lengthof(_newgrf_files) && _newgrf_files[j]; j++)
-			load_index += LoadNewGrfFile(_newgrf_files[j], load_index, i++);
-
-
 		// If needed, save the cache to file
 		HandleCachedSpriteHeaders(_cached_filenames[_opt.landscape], false);
 	} else {