1
0
Fork 0

(svn r1702) - Fix: [ 1110407 ] Game does not crash any more when a newgrf file doesn't exist

release/0.4.5
dominik 2005-01-28 08:56:43 +00:00
parent 3e0dcfd47f
commit c8d084a85e
3 changed files with 46 additions and 12 deletions

View File

@ -100,6 +100,42 @@ void FioCloseAll(void)
FioCloseFile(i); 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) void FioOpenFile(int slot, const char *filename)
{ {
FILE *f; FILE *f;

View File

@ -11,5 +11,6 @@ void FioCloseAll(void);
void FioOpenFile(int slot, const char *filename); void FioOpenFile(int slot, const char *filename);
void FioReadBlock(void *ptr, uint size); void FioReadBlock(void *ptr, uint size);
void FioSkipBytes(int n); void FioSkipBytes(int n);
bool FiosCheckFileExists(const char *filename);
#endif /* FILEIO_H */ #endif /* FILEIO_H */

View File

@ -893,20 +893,17 @@ static void LoadSpriteTables(void)
/* Load newgrf sprites */ /* 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; _custom_sprites_base = load_index;
for (_loading_stage = 0; _loading_stage < 2; _loading_stage++) {
_loading_stage = 0;
for (j = 0; j != lengthof(_newgrf_files) && _newgrf_files[j]; j++) { 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); InitNewGRFFile(_newgrf_files[j], load_index);
load_index += LoadNewGrfFile(_newgrf_files[j], load_index, i++); 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 // If needed, save the cache to file
HandleCachedSpriteHeaders(_cached_filenames[_opt.landscape], false); HandleCachedSpriteHeaders(_cached_filenames[_opt.landscape], false);