Prechádzať zdrojové kódy

Allow merged games marked as 'release' to have their save dir directly in the appdata dir

Bart van Strien 14 rokov pred
rodič
commit
fc5cda36e2

+ 21 - 4
src/modules/filesystem/physfs/Filesystem.cpp

@@ -34,7 +34,7 @@ namespace filesystem
 namespace physfs
 {
 	Filesystem::Filesystem()
-		: open_count(0), buffer(0), isInited(false)
+		: open_count(0), buffer(0), isInited(false), release(false), releaseSet(false)
 	{
 	}
 
@@ -59,6 +59,14 @@ namespace physfs
 		isInited = true;
 	}
 
+	void Filesystem::setRelease(bool release)
+	{
+		if (releaseSet)
+			return;
+		this->release = release;
+		releaseSet = true;
+	}
+
 	bool Filesystem::setIdentity( const char * ident )
 	{
 		if(!isInited)
@@ -68,11 +76,14 @@ namespace physfs
 		save_identity = std::string(ident);
 
 		// Generate the relative path to the game save folder.
-		save_path_relative = std::string(LOVE_APPDATA_FOLDER LOVE_PATH_SEPARATOR) + save_identity;
+		save_path_relative = std::string(LOVE_APPDATA_PREFIX LOVE_APPDATA_FOLDER LOVE_PATH_SEPARATOR) + save_identity;
 
 		// Generate the full path to the game save folder.
 		save_path_full = std::string(getAppdataDirectory()) + std::string(LOVE_PATH_SEPARATOR);
-		save_path_full += save_path_relative;
+		if (release)
+			save_path_full += std::string(LOVE_APPDATA_PREFIX) + save_identity;
+		else
+			save_path_full += save_path_relative;
 
 		// We now have something like:
 		// save_identity: game
@@ -120,7 +131,13 @@ namespace physfs
 			return false;
 
 		// Create the save folder. (We're now "at" %APPDATA%).
-		if(!mkdir(save_path_relative.c_str()))
+		bool success = false;
+		if (release)
+			success = mkdir(save_identity.c_str());
+		else
+			success = mkdir(save_path_relative.c_str());
+
+		if(!success)
 		{
 			PHYSFS_setWriteDir(0); // Clear the write directory in case of error.
 			return false;

+ 10 - 1
src/modules/filesystem/physfs/Filesystem.h

@@ -46,6 +46,7 @@
 
 // In Windows, we would like to use "LOVE" as the
 // application folder, but in Linux, we like .love.
+#define LOVE_APPDATA_PREFIX ""
 #ifdef LOVE_WINDOWS
 #	define LOVE_APPDATA_FOLDER "LOVE"
 #	define LOVE_PATH_SEPARATOR "/"
@@ -56,7 +57,8 @@
 #	elif defined(LOVE_LINUX)
 #		define LOVE_APPDATA_FOLDER "love"
 #	else
-#		define LOVE_APPDATA_FOLDER ".love"
+#		define LOVE_APPDATA_PREFIX "."
+#		define LOVE_APPDATA_FOLDER "love"
 #	endif
 #	define LOVE_PATH_SEPARATOR "/"
 #	define LOVE_MAX_PATH MAXPATHLEN
@@ -99,6 +101,11 @@ namespace physfs
 		// Workaround for machines without PhysFS 2.0
 		bool isInited;
 
+		// Allow saving outside of the LOVE_APPDATA_FOLDER
+		// for release 'builds'
+		bool release;
+		bool releaseSet;
+
 	protected:
 
 	public:
@@ -111,6 +118,8 @@ namespace physfs
 
 		void init(const char * arg0);
 
+		void setRelease(bool release);
+
 		/**
 		* This sets up the save directory. If the
 		* it is already set up, nothing happens.

+ 9 - 0
src/modules/filesystem/physfs/wrap_Filesystem.cpp

@@ -52,6 +52,14 @@ namespace physfs
 		return 0;
 	}
 
+	int w_setRelease(lua_State * L)
+	{
+		// no error checking needed, everything, even nothing
+		// can be converted to a boolean
+		instance->setRelease(lua_toboolean(L, 1));
+		return 0;
+	}
+
 	int w_setIdentity(lua_State * L)
 	{
 		const char * arg = luaL_checkstring(L, 1);
@@ -290,6 +298,7 @@ namespace physfs
 	// List of functions to wrap.
 	static const luaL_Reg functions[] = {
 		{ "init",  w_init },
+		{ "setRelease", w_setRelease },
 		{ "setIdentity",  w_setIdentity },
 		{ "setSource",  w_setSource },
 		{ "newFile",  w_newFile },

+ 1 - 0
src/modules/filesystem/physfs/wrap_Filesystem.h

@@ -34,6 +34,7 @@ namespace physfs
 {
 	bool hack_setupWriteDirectory();
 	int w_init(lua_State * L);
+	int w_setRelease(lua_State * L);
 	int w_setIdentity(lua_State * L);
 	int w_setSource(lua_State * L);
 	int w_newFile(lua_State * L);

+ 8 - 3
src/scripts/boot.lua

@@ -182,6 +182,8 @@ function love.createhandlers()
 
 end
 
+local is_fused_game = false
+
 -- This can't be overriden.
 function love.boot()
 
@@ -198,6 +200,7 @@ function love.boot()
 
 	-- Is this one of those fancy "fused" games?
 	local can_has_game = pcall(love.filesystem.setSource, arg0)
+	is_fused_game = can_has_game
 
 	if not can_has_game and o.game.set and o.game.arg[1] then
 		local full_source =  love.path.getfull(o.game.arg[1])
@@ -297,9 +300,11 @@ function love.init()
 		love.graphics.setCaption(c.title)
 	end
 
-	if love.filesystem and c.identity then love.filesystem.setIdentity(c.identity) end
-
-	if love.filesystem and love.filesystem.exists("main.lua") then require("main.lua") end
+	if love.filesystem then
+		love.filesystem.setRelease(c.release and is_fused_game)
+		if c.identity then love.filesystem.setIdentity(c.identity) end
+		if love.filesystem.exists("main.lua") then require("main.lua") end
+	end
 
 	if no_game_code then
 		error("No code to run\nYour game might be packaged incorrectly\nMake sure main.lua is at the top level of the zip")

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 1739 - 1805
src/scripts/boot.lua.h


Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov