changeset 11261:5a50ba45cf24 draft

(svn r15610) -Change: allow loading of heightmaps and savegames (any form) that are in .tar files
author rubidium <rubidium@openttd.org>
date Wed, 04 Mar 2009 09:53:31 +0000
parents 6b0149b64909
children de226219239a
files src/fileio.cpp src/fios.cpp src/heightmap.cpp src/saveload/oldloader.cpp src/saveload/saveload.cpp
diffstat 5 files changed, 19 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/src/fileio.cpp
+++ b/src/fileio.cpp
@@ -358,7 +358,7 @@
 	}
 
 	/* We can only use .tar in case of data-dir, and read-mode */
-	if (f == NULL && (subdir == DATA_DIR || subdir == AI_DIR || subdir == AI_LIBRARY_DIR) && mode[0] == 'r') {
+	if (f == NULL && mode[0] == 'r') {
 		static const uint MAX_RESOLVED_LENGTH = 2 * (100 + 100 + 155) + 1; // Enough space to hold two filenames plus link. See 'TarHeader'.
 		char resolved_name[MAX_RESOLVED_LENGTH];
 
@@ -777,6 +777,8 @@
 		num += ScanPathForTarFiles(path, strlen(path));
 		FioAppendDirectory(path, MAX_PATH, sp, AI_LIBRARY_DIR);
 		num += ScanPathForTarFiles(path, strlen(path));
+		FioAppendDirectory(path, MAX_PATH, sp, SCENARIO_DIR);
+		num += ScanPathForTarFiles(path, strlen(path));
 	}
 	DEBUG(misc, 1, "Scan complete, found %d files", num);
 }
--- a/src/fios.cpp
+++ b/src/fios.cpp
@@ -37,7 +37,7 @@
 extern bool FiosGetDiskFreeSpace(const char *path, uint64 *tot);
 
 /* get the name of an oldstyle savegame */
-extern void GetOldSaveGameName(const char *path, const char *file, char *title, const char *last);
+extern void GetOldSaveGameName(const char *file, char *title, const char *last);
 
 /**
  * Compare two FiosItem's. Used with qsort when sorting the file list.
@@ -343,7 +343,7 @@
 	if (mode == SLD_LOAD_GAME || mode == SLD_LOAD_SCENARIO) {
 		if (strcasecmp(ext, ".ss1") == 0 || strcasecmp(ext, ".sv1") == 0 ||
 				strcasecmp(ext, ".sv2") == 0) {
-			if (title != NULL) GetOldSaveGameName(_fios_path, file, title, last);
+			if (title != NULL) GetOldSaveGameName(file, title, last);
 			return FIOS_TYPE_OLDFILE;
 		}
 	}
@@ -392,7 +392,7 @@
 
 	if (mode == SLD_LOAD_GAME || mode == SLD_LOAD_SCENARIO || mode == SLD_NEW_GAME) {
 		if (strcasecmp(ext, ".sv0") == 0 || strcasecmp(ext, ".ss0") == 0 ) {
-			GetOldSaveGameName(_fios_path, file, title, last);
+			GetOldSaveGameName(file, title, last);
 			return FIOS_TYPE_OLD_SCENARIO;
 		}
 	}
--- a/src/heightmap.cpp
+++ b/src/heightmap.cpp
@@ -12,6 +12,7 @@
 #include "gfx_func.h"
 #include "fios.h"
 #include "settings_type.h"
+#include "fileio_func.h"
 
 #include "table/strings.h"
 
@@ -98,7 +99,7 @@
 	png_structp png_ptr = NULL;
 	png_infop info_ptr  = NULL;
 
-	fp = fopen(filename, "rb");
+	fp = FioFOpenFile(filename, "rb");
 	if (fp == NULL) {
 		ShowErrorMessage(STR_PNGMAP_ERR_FILE_NOT_FOUND, STR_PNGMAP_ERROR, 0, 0);
 		return false;
@@ -221,7 +222,7 @@
 	/* Init BmpData */
 	memset(&data, 0, sizeof(data));
 
-	f = fopen(filename, "rb");
+	f = FioFOpenFile(filename, "rb");
 	if (f == NULL) {
 		ShowErrorMessage(STR_PNGMAP_ERR_FILE_NOT_FOUND, STR_BMPMAP_ERROR, 0, 0);
 		return false;
--- a/src/saveload/oldloader.cpp
+++ b/src/saveload/oldloader.cpp
@@ -9,6 +9,7 @@
 #include "../strings_type.h"
 #include "../string_func.h"
 #include "../settings_type.h"
+#include "../fileio_func.h"
 
 #include "table/strings.h"
 
@@ -224,7 +225,6 @@
 {
 	assert(last - temp + 1 >= (int)len);
 
-	fseek(f, 0, SEEK_SET);
 	if (fread(temp, 1, len, f) != len) {
 		temp[0] = '\0'; // if reading failed, make the name empty
 		return false;
@@ -243,8 +243,11 @@
 
 	SavegameType type = SGT_TTO;
 
+	/* Can't fseek to 0 as in tar files that is not correct */
+	long pos = ftell(f);
 	if (!CheckOldSavegameType(f, temp, lastof(temp), TTO_HEADER_SIZE)) {
 		type = SGT_TTD;
+		fseek(f, pos, SEEK_SET);
 		if (!CheckOldSavegameType(f, temp, lastof(temp), TTD_HEADER_SIZE)) {
 			type = SGT_INVALID;
 		}
@@ -273,7 +276,7 @@
 	InitLoading(&ls);
 
 	/* Open file */
-	ls.file = fopen(file, "rb");
+	ls.file = FioFOpenFile(file, "rb");
 
 	if (ls.file == NULL) {
 		DEBUG(oldloader, 0, "Cannot open file '%s'", file);
@@ -303,12 +306,9 @@
 	return true;
 }
 
-void GetOldSaveGameName(const char *path, const char *file, char *title, const char *last)
+void GetOldSaveGameName(const char *file, char *title, const char *last)
 {
-	char filename[MAX_PATH];
-
-	snprintf(filename, lengthof(filename), "%s" PATHSEP "%s", path, file);
-	FILE *f = fopen(filename, "rb");
+	FILE *f = FioFOpenFile(file, "rb");
 
 	if (f == NULL) {
 		*title = '\0';
--- a/src/saveload/saveload.cpp
+++ b/src/saveload/saveload.cpp
@@ -1737,6 +1737,8 @@
 			assert(mode == SL_LOAD);
 			DEBUG(desync, 1, "load: %s\n", filename);
 
+			/* Can't fseek to 0 as in tar files that is not correct */
+			long pos = ftell(_sl.fh);
 			if (fread(hdr, sizeof(hdr), 1, _sl.fh) != 1) SlError(STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE);
 
 			/* see if we have any loader for this type. */
@@ -1744,13 +1746,8 @@
 				/* No loader found, treat as version 0 and use LZO format */
 				if (fmt == endof(_saveload_formats)) {
 					DEBUG(sl, 0, "Unknown savegame type, trying to load it as the buggy format");
-	#if defined(WINCE)
-					/* Of course some system had not to support rewind ;) */
-					fseek(_sl.fh, 0L, SEEK_SET);
 					clearerr(_sl.fh);
-	#else
-					rewind(_sl.fh);
-	#endif
+					fseek(_sl.fh, pos, SEEK_SET);
 					_sl_version = 0;
 					_sl_minor_version = 0;
 					fmt = _saveload_formats + 1; // LZO