mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2024-11-17 16:39:42 +01:00
Axe save file migration
The chances of someone using 2.0, then directly jumping to 2.4, are pretty low - 2.0 is almost a decade old at this point.
This commit is contained in:
parent
85dc6db85b
commit
bca8d39bd7
1 changed files with 1 additions and 181 deletions
|
@ -25,13 +25,9 @@ int mkdir(char* path, int mode)
|
||||||
MultiByteToWideChar(CP_UTF8, 0, path, -1, utf16_path, MAX_PATH);
|
MultiByteToWideChar(CP_UTF8, 0, path, -1, utf16_path, MAX_PATH);
|
||||||
return CreateDirectoryW(utf16_path, NULL);
|
return CreateDirectoryW(utf16_path, NULL);
|
||||||
}
|
}
|
||||||
#define VNEEDS_MIGRATION (mkdirResult != 0)
|
|
||||||
#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__HAIKU__) || defined(__DragonFly__)
|
#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__HAIKU__) || defined(__DragonFly__)
|
||||||
#include <unistd.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#define VNEEDS_MIGRATION (mkdirResult == 0)
|
|
||||||
#define MAX_PATH PATH_MAX
|
#define MAX_PATH PATH_MAX
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -42,8 +38,6 @@ static char assetDir[MAX_PATH] = {'\0'};
|
||||||
static char virtualMountPath[MAX_PATH] = {'\0'};
|
static char virtualMountPath[MAX_PATH] = {'\0'};
|
||||||
|
|
||||||
static int PLATFORM_getOSDirectory(char* output, const size_t output_size);
|
static int PLATFORM_getOSDirectory(char* output, const size_t output_size);
|
||||||
static void PLATFORM_migrateSaveData(char* output);
|
|
||||||
static void PLATFORM_copyFile(const char *oldLocation, const char *newLocation);
|
|
||||||
|
|
||||||
static void* bridged_malloc(PHYSFS_uint64 size)
|
static void* bridged_malloc(PHYSFS_uint64 size)
|
||||||
{
|
{
|
||||||
|
@ -66,7 +60,6 @@ static const PHYSFS_Allocator allocator = {
|
||||||
int FILESYSTEM_init(char *argvZero, char* baseDir, char *assetsPath)
|
int FILESYSTEM_init(char *argvZero, char* baseDir, char *assetsPath)
|
||||||
{
|
{
|
||||||
char output[MAX_PATH];
|
char output[MAX_PATH];
|
||||||
int mkdirResult;
|
|
||||||
int retval;
|
int retval;
|
||||||
const char* pathSep = PHYSFS_getDirSeparator();
|
const char* pathSep = PHYSFS_getDirSeparator();
|
||||||
char* basePath;
|
char* basePath;
|
||||||
|
@ -136,15 +129,9 @@ int FILESYSTEM_init(char *argvZero, char* baseDir, char *assetsPath)
|
||||||
"levels",
|
"levels",
|
||||||
pathSep
|
pathSep
|
||||||
);
|
);
|
||||||
mkdirResult = mkdir(levelDir, 0777);
|
mkdir(levelDir, 0777);
|
||||||
printf("Level directory: %s\n", levelDir);
|
printf("Level directory: %s\n", levelDir);
|
||||||
|
|
||||||
/* We didn't exist until now, migrate files! */
|
|
||||||
if (VNEEDS_MIGRATION)
|
|
||||||
{
|
|
||||||
PLATFORM_migrateSaveData(output);
|
|
||||||
}
|
|
||||||
|
|
||||||
basePath = SDL_GetBasePath();
|
basePath = SDL_GetBasePath();
|
||||||
|
|
||||||
if (basePath == NULL)
|
if (basePath == NULL)
|
||||||
|
@ -1000,173 +987,6 @@ static int PLATFORM_getOSDirectory(char* output, const size_t output_size)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void PLATFORM_migrateSaveData(char* output)
|
|
||||||
{
|
|
||||||
char oldLocation[MAX_PATH];
|
|
||||||
char newLocation[MAX_PATH];
|
|
||||||
char oldDirectory[MAX_PATH];
|
|
||||||
#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__HAIKU__) || defined(__DragonFly__)
|
|
||||||
DIR *dir = NULL;
|
|
||||||
struct dirent *de = NULL;
|
|
||||||
DIR *subDir = NULL;
|
|
||||||
struct dirent *subDe = NULL;
|
|
||||||
char subDirLocation[MAX_PATH];
|
|
||||||
const char *homeDir = SDL_getenv("HOME");
|
|
||||||
if (homeDir == NULL)
|
|
||||||
{
|
|
||||||
/* Uhh, I don't want to get near this. -flibit */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const char oldPath[] =
|
|
||||||
#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__HAIKU__) || defined(__DragonFly__)
|
|
||||||
"/.vvvvvv/";
|
|
||||||
#elif defined(__APPLE__)
|
|
||||||
"/Documents/VVVVVV/";
|
|
||||||
#endif
|
|
||||||
SDL_snprintf(oldDirectory, sizeof(oldDirectory), "%s%s", homeDir, oldPath);
|
|
||||||
dir = opendir(oldDirectory);
|
|
||||||
if (!dir)
|
|
||||||
{
|
|
||||||
printf("Could not find directory %s\n", oldDirectory);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("Migrating old savedata to new location...\n");
|
|
||||||
for (de = readdir(dir); de != NULL; de = readdir(dir))
|
|
||||||
{
|
|
||||||
if ( SDL_strcmp(de->d_name, "..") == 0 ||
|
|
||||||
SDL_strcmp(de->d_name, ".") == 0 )
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
#define COPY_SAVEFILE(name) \
|
|
||||||
else if (SDL_strcmp(de->d_name, name) == 0) \
|
|
||||||
{ \
|
|
||||||
SDL_snprintf(oldLocation, sizeof(oldLocation), "%s%s", oldDirectory, name); \
|
|
||||||
SDL_snprintf(newLocation, sizeof(newLocation), "%ssaves/%s", output, name); \
|
|
||||||
PLATFORM_copyFile(oldLocation, newLocation); \
|
|
||||||
}
|
|
||||||
COPY_SAVEFILE("unlock.vvv")
|
|
||||||
COPY_SAVEFILE("tsave.vvv")
|
|
||||||
COPY_SAVEFILE("qsave.vvv")
|
|
||||||
#undef COPY_SAVEFILE
|
|
||||||
else if (SDL_strstr(de->d_name, ".vvvvvv.vvv") != NULL)
|
|
||||||
{
|
|
||||||
SDL_snprintf(oldLocation, sizeof(oldLocation), "%s%s", oldDirectory, de->d_name);
|
|
||||||
SDL_snprintf(newLocation, sizeof(newLocation), "%ssaves/%s", output, de->d_name);
|
|
||||||
PLATFORM_copyFile(oldLocation, newLocation);
|
|
||||||
}
|
|
||||||
else if (SDL_strstr(de->d_name, ".vvvvvv") != NULL)
|
|
||||||
{
|
|
||||||
SDL_snprintf(oldLocation, sizeof(oldLocation), "%s%s", oldDirectory, de->d_name);
|
|
||||||
SDL_snprintf(newLocation, sizeof(newLocation), "%slevels/%s", output, de->d_name);
|
|
||||||
PLATFORM_copyFile(oldLocation, newLocation);
|
|
||||||
}
|
|
||||||
else if (SDL_strcmp(de->d_name, "Saves") == 0)
|
|
||||||
{
|
|
||||||
SDL_snprintf(subDirLocation, sizeof(subDirLocation), "%sSaves/", oldDirectory);
|
|
||||||
subDir = opendir(subDirLocation);
|
|
||||||
if (!subDir)
|
|
||||||
{
|
|
||||||
printf("Could not open Saves/ subdir!\n");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for (
|
|
||||||
subDe = readdir(subDir);
|
|
||||||
subDe != NULL;
|
|
||||||
subDe = readdir(subDir)
|
|
||||||
) {
|
|
||||||
#define COPY_SAVEFILE(name) \
|
|
||||||
(SDL_strcmp(subDe->d_name, name) == 0) \
|
|
||||||
{ \
|
|
||||||
SDL_snprintf(oldLocation, sizeof(oldLocation), "%s%s", subDirLocation, name); \
|
|
||||||
SDL_snprintf(newLocation, sizeof(newLocation), "%ssaves/%s", output, name); \
|
|
||||||
PLATFORM_copyFile(oldLocation, newLocation); \
|
|
||||||
}
|
|
||||||
if COPY_SAVEFILE("unlock.vvv")
|
|
||||||
else if COPY_SAVEFILE("tsave.vvv")
|
|
||||||
else if COPY_SAVEFILE("qsave.vvv")
|
|
||||||
#undef COPY_SAVEFILE
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#elif defined(_WIN32)
|
|
||||||
WIN32_FIND_DATA findHandle;
|
|
||||||
HANDLE hFind = NULL;
|
|
||||||
char fileSearch[MAX_PATH];
|
|
||||||
|
|
||||||
/* Same place, different layout. */
|
|
||||||
SDL_strlcpy(oldDirectory, output, sizeof(oldDirectory));
|
|
||||||
|
|
||||||
SDL_snprintf(fileSearch, sizeof(fileSearch), "%s\\*.vvvvvv", oldDirectory);
|
|
||||||
hFind = FindFirstFile(fileSearch, &findHandle);
|
|
||||||
if (hFind == INVALID_HANDLE_VALUE)
|
|
||||||
{
|
|
||||||
printf("Could not find directory %s\n", oldDirectory);
|
|
||||||
}
|
|
||||||
else do
|
|
||||||
{
|
|
||||||
if ((findHandle.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
|
|
||||||
{
|
|
||||||
SDL_snprintf(oldLocation, sizeof(oldLocation), "%s%s", oldDirectory, findHandle.cFileName);
|
|
||||||
SDL_snprintf(newLocation, sizeof(newLocation), "%slevels\\%s", output, findHandle.cFileName);
|
|
||||||
PLATFORM_copyFile(oldLocation, newLocation);
|
|
||||||
}
|
|
||||||
} while (FindNextFile(hFind, &findHandle));
|
|
||||||
#else
|
|
||||||
#error See PLATFORM_migrateSaveData
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static void PLATFORM_copyFile(const char *oldLocation, const char *newLocation)
|
|
||||||
{
|
|
||||||
char *data;
|
|
||||||
size_t length, bytes_read, bytes_written;
|
|
||||||
|
|
||||||
/* Read data */
|
|
||||||
FILE *file = fopen(oldLocation, "rb");
|
|
||||||
if (!file)
|
|
||||||
{
|
|
||||||
printf("Cannot open/copy %s\n", oldLocation);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
fseek(file, 0, SEEK_END);
|
|
||||||
length = ftell(file);
|
|
||||||
fseek(file, 0, SEEK_SET);
|
|
||||||
data = (char*) SDL_malloc(length);
|
|
||||||
if (data == NULL)
|
|
||||||
{
|
|
||||||
VVV_exit(1);
|
|
||||||
}
|
|
||||||
bytes_read = fread(data, 1, length, file);
|
|
||||||
fclose(file);
|
|
||||||
if (bytes_read != length)
|
|
||||||
{
|
|
||||||
printf("An error occurred when reading from %s\n", oldLocation);
|
|
||||||
SDL_free(data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write data */
|
|
||||||
file = fopen(newLocation, "wb");
|
|
||||||
if (!file)
|
|
||||||
{
|
|
||||||
printf("Could not write to %s\n", newLocation);
|
|
||||||
SDL_free(data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
bytes_written = fwrite(data, 1, length, file);
|
|
||||||
fclose(file);
|
|
||||||
SDL_free(data);
|
|
||||||
|
|
||||||
/* WTF did we just do */
|
|
||||||
printf("Copied:\n\tOld: %s\n\tNew: %s\n", oldLocation, newLocation);
|
|
||||||
if (bytes_written != length)
|
|
||||||
{
|
|
||||||
printf("Warning: an error occurred when writing to %s\n", newLocation);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FILESYSTEM_openDirectoryEnabled(void)
|
bool FILESYSTEM_openDirectoryEnabled(void)
|
||||||
{
|
{
|
||||||
/* This is just a check to see if we're on a desktop or tenfoot setup.
|
/* This is just a check to see if we're on a desktop or tenfoot setup.
|
||||||
|
|
Loading…
Reference in a new issue