(svn r1702) - Fix: [ 1110407 ] Game does not crash any more when a newgrf file doesn't exist
--- 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 {