Browse Source

SDCard support for Windows Phone build. Now the game data can be placed in 'SDLPAL' folder under the root of sdcard. Validated in simulator.

louyihua 8 years ago
parent
commit
5a9b5b85b6

+ 1 - 1
common.h

@@ -205,7 +205,7 @@ extern "C"
 
 #elif defined (__WINPHONE__)
 
-#define PAL_PREFIX            "Assets\\Data\\"
+#define PAL_PREFIX            UTIL_WP_BasePath()
 #define PAL_SAVE_PREFIX       UTIL_WP_SavePath()
 #define PAL_HAS_TOUCH         1
 #define PAL_AUDIO_DEFAULT_BUFFER_SIZE   4096

+ 9 - 8
main.c

@@ -524,6 +524,15 @@ main(
 #endif
 
 #ifdef __WINPHONE__
+   //
+   // In windows phone, calling exit(0) directly will cause an abnormal exit.
+   // By using setjmp/longjmp to avoid this.
+   //
+   if (setjmp(g_exit_jmp_env) == LONGJMP_EXIT_CODE) return 0;
+
+   // We should first check the SD card before running actual codes
+   UTIL_WP_BasePath();
+
    SDL_SetHint(SDL_HINT_ORIENTATIONS, "LandscapeRight");
    SDL_SetHint(SDL_HINT_WINRT_HANDLE_BACK_BUTTON, "1");
 #endif
@@ -542,14 +551,6 @@ main(
 #endif
    PAL_Init();
 
-#ifdef __WINPHONE__
-   //
-   // In windows phone, calling exit(0) directly will cause an abnormal exit.
-   // By using setjmp/longjmp to avoid this.
-   //
-   if (setjmp(g_exit_jmp_env) == LONGJMP_EXIT_CODE) return 0;
-#endif
-
    //
    // Show the trademark screen and splash screen
    //

+ 0 - 1
sdlpal.vcxproj

@@ -89,7 +89,6 @@
       </HeaderFileName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\SDL2-2.0.3\include;.\liboggvorbis\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>true</MinimalRebuild>

+ 5 - 0
util.h

@@ -107,6 +107,11 @@ UTIL_IOS_SavePath(
 
 #ifdef __WINPHONE__
 
+LPCSTR
+UTIL_WP_BasePath(
+   VOID
+);
+
 LPCSTR
 UTIL_WP_SavePath(
    VOID

+ 1 - 1
winphone/SDLPal.sln

@@ -5,7 +5,7 @@ VisualStudioVersion = 14.0.23107.0
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDL2-WinPhone81", "SDL2\VisualC-WinRT\WinPhone81_VS2013\SDL-WinPhone81.vcxproj", "{48FADC0E-964D-4DAB-BCED-372E0AD19577}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDLPalLib", "SDLPalLib\SDLPalLib.vcxproj", "{704D3871-2E86-42EF-A607-CBCFB7A7EBAB}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDLPalCore", "SDLPalCore\SDLPalCore.vcxproj", "{704D3871-2E86-42EF-A607-CBCFB7A7EBAB}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDLPal", "SDLPal\SDLPal.vcxproj", "{4C240E16-F6F6-4D60-B29B-7F7ACB4815D7}"
 EndProject

+ 0 - 1
winphone/SDLPal/Assets/Data/README.txt

@@ -1 +0,0 @@
-Copy the data files here.

+ 17 - 1
winphone/SDLPal/Package.appxmanifest

@@ -21,9 +21,25 @@
         </m3:DefaultTile>
         <m3:SplashScreen Image="Assets\SplashScreen.png" BackgroundColor="black" />
       </m3:VisualElements>
+      <Extensions>
+        <Extension Category="windows.fileTypeAssociation">
+          <FileTypeAssociation Name="pal">
+            <SupportedFileTypes>
+              <FileType>.mkf</FileType>
+              <FileType>.dat</FileType>
+              <FileType>.msg</FileType>
+              <FileType>.cfg</FileType>
+              <FileType>.asc</FileType>
+              <FileType>.mp3</FileType>
+              <FileType>.ogg</FileType>
+              <FileType>.rpg</FileType>
+            </SupportedFileTypes>
+          </FileTypeAssociation>
+        </Extension>
+      </Extensions>
     </Application>
   </Applications>
   <Capabilities>
-    <Capability Name="internetClientServer" />
+    <Capability Name="removableStorage" />
   </Capabilities>
 </Package>

+ 1 - 113
winphone/SDLPal/SDLPal.vcxproj

@@ -180,126 +180,14 @@
     <ClCompile Include="..\SDL2\src\main\winrt\SDL_winrt_main_NonXAML.cpp" />
     <ClCompile Include="WinPhoneUtil.cpp" />
   </ItemGroup>
-  <ItemGroup>
-    <None Include="Assets\Data\ABC.MKF">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\BALL.MKF">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\DATA.MKF">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\F.MKF">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\FBP.MKF">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\FIRE.MKF">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\GOP.MKF">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\M.MSG">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\MAP.MKF">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\MGO.MKF">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\MUS.MKF">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\OGG\10002.ogg">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\OGG\10003.ogg">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\OGG\10004.ogg">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\OGG\10005.ogg">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\OGG\10006.ogg">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\OGG\10007.ogg">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\OGG\10008.ogg">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\OGG\10009.ogg">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\OGG\10010.ogg">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\OGG\10011.ogg">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\OGG\10012.ogg">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\OGG\10013.ogg">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\PAT.MKF">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\RGM.MKF">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\RNG.MKF">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\sdlpal.cfg">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\SSS.MKF">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\VOC.MKF">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\WOR16.ASC">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\WOR16.FON">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="Assets\Data\WORD.DAT">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-  </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\SDL2\VisualC-WinRT\WinPhone81_VS2013\SDL-WinPhone81.vcxproj">
       <Project>{48fadc0e-964d-4dab-bced-372e0ad19577}</Project>
     </ProjectReference>
-    <ProjectReference Include="..\SDLPalLib\SDLPalLib.vcxproj">
+    <ProjectReference Include="..\SDLPalCore\SDLPalCore.vcxproj">
       <Project>{704d3871-2e86-42ef-a607-cbcfb7a7ebab}</Project>
     </ProjectReference>
   </ItemGroup>
-  <ItemGroup>
-    <Media Include="Assets\Data\MP3\10002.MP3" />
-    <Media Include="Assets\Data\MP3\10003.MP3" />
-    <Media Include="Assets\Data\MP3\10004.MP3" />
-    <Media Include="Assets\Data\MP3\10005.MP3" />
-    <Media Include="Assets\Data\MP3\10006.MP3" />
-    <Media Include="Assets\Data\MP3\10007.MP3" />
-    <Media Include="Assets\Data\MP3\10008.MP3" />
-    <Media Include="Assets\Data\MP3\10009.MP3" />
-    <Media Include="Assets\Data\MP3\10010.MP3" />
-    <Media Include="Assets\Data\MP3\10011.MP3" />
-    <Media Include="Assets\Data\MP3\10012.MP3" />
-    <Media Include="Assets\Data\MP3\10013.MP3" />
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>

+ 0 - 148
winphone/SDLPal/SDLPal.vcxproj.filters

@@ -23,18 +23,6 @@
     <Image Include="Assets\WideLogo.scale-240.png">
       <Filter>资产</Filter>
     </Image>
-    <Filter Include="资产\Data">
-      <UniqueIdentifier>{77c8944a-e166-4a2c-b515-9550e82a9d63}</UniqueIdentifier>
-      <SourceControlFiles>False</SourceControlFiles>
-    </Filter>
-    <Filter Include="资产\Data\OGG">
-      <UniqueIdentifier>{08b020ee-aa73-48f6-83b9-ad6573dd0dcc}</UniqueIdentifier>
-      <SourceControlFiles>False</SourceControlFiles>
-    </Filter>
-    <Filter Include="资产\Data\MP3">
-      <UniqueIdentifier>{eb7b143d-6d18-479d-8908-7d6fc6f86449}</UniqueIdentifier>
-      <SourceControlFiles>False</SourceControlFiles>
-    </Filter>
     <Filter Include="SDL2">
       <UniqueIdentifier>{1b4126fa-ab18-4d2a-8fc0-dff551a94158}</UniqueIdentifier>
       <SourceControlFiles>False</SourceControlFiles>
@@ -49,142 +37,6 @@
   <ItemGroup>
     <AppxManifest Include="Package.appxmanifest" />
   </ItemGroup>
-  <ItemGroup>
-    <None Include="Assets\Data\ABC.MKF">
-      <Filter>资产\Data</Filter>
-    </None>
-    <None Include="Assets\Data\BALL.MKF">
-      <Filter>资产\Data</Filter>
-    </None>
-    <None Include="Assets\Data\DATA.MKF">
-      <Filter>资产\Data</Filter>
-    </None>
-    <None Include="Assets\Data\F.MKF">
-      <Filter>资产\Data</Filter>
-    </None>
-    <None Include="Assets\Data\FBP.MKF">
-      <Filter>资产\Data</Filter>
-    </None>
-    <None Include="Assets\Data\FIRE.MKF">
-      <Filter>资产\Data</Filter>
-    </None>
-    <None Include="Assets\Data\GOP.MKF">
-      <Filter>资产\Data</Filter>
-    </None>
-    <None Include="Assets\Data\M.MSG">
-      <Filter>资产\Data</Filter>
-    </None>
-    <None Include="Assets\Data\MAP.MKF">
-      <Filter>资产\Data</Filter>
-    </None>
-    <None Include="Assets\Data\MGO.MKF">
-      <Filter>资产\Data</Filter>
-    </None>
-    <None Include="Assets\Data\MUS.MKF">
-      <Filter>资产\Data</Filter>
-    </None>
-    <None Include="Assets\Data\PAT.MKF">
-      <Filter>资产\Data</Filter>
-    </None>
-    <None Include="Assets\Data\RGM.MKF">
-      <Filter>资产\Data</Filter>
-    </None>
-    <None Include="Assets\Data\RNG.MKF">
-      <Filter>资产\Data</Filter>
-    </None>
-    <None Include="Assets\Data\sdlpal.cfg">
-      <Filter>资产\Data</Filter>
-    </None>
-    <None Include="Assets\Data\SSS.MKF">
-      <Filter>资产\Data</Filter>
-    </None>
-    <None Include="Assets\Data\VOC.MKF">
-      <Filter>资产\Data</Filter>
-    </None>
-    <None Include="Assets\Data\WOR16.ASC">
-      <Filter>资产\Data</Filter>
-    </None>
-    <None Include="Assets\Data\WOR16.FON">
-      <Filter>资产\Data</Filter>
-    </None>
-    <None Include="Assets\Data\WORD.DAT">
-      <Filter>资产\Data</Filter>
-    </None>
-    <None Include="Assets\Data\OGG\10002.ogg">
-      <Filter>资产\Data\OGG</Filter>
-    </None>
-    <None Include="Assets\Data\OGG\10003.ogg">
-      <Filter>资产\Data\OGG</Filter>
-    </None>
-    <None Include="Assets\Data\OGG\10004.ogg">
-      <Filter>资产\Data\OGG</Filter>
-    </None>
-    <None Include="Assets\Data\OGG\10005.ogg">
-      <Filter>资产\Data\OGG</Filter>
-    </None>
-    <None Include="Assets\Data\OGG\10006.ogg">
-      <Filter>资产\Data\OGG</Filter>
-    </None>
-    <None Include="Assets\Data\OGG\10007.ogg">
-      <Filter>资产\Data\OGG</Filter>
-    </None>
-    <None Include="Assets\Data\OGG\10008.ogg">
-      <Filter>资产\Data\OGG</Filter>
-    </None>
-    <None Include="Assets\Data\OGG\10009.ogg">
-      <Filter>资产\Data\OGG</Filter>
-    </None>
-    <None Include="Assets\Data\OGG\10010.ogg">
-      <Filter>资产\Data\OGG</Filter>
-    </None>
-    <None Include="Assets\Data\OGG\10011.ogg">
-      <Filter>资产\Data\OGG</Filter>
-    </None>
-    <None Include="Assets\Data\OGG\10012.ogg">
-      <Filter>资产\Data\OGG</Filter>
-    </None>
-    <None Include="Assets\Data\OGG\10013.ogg">
-      <Filter>资产\Data\OGG</Filter>
-    </None>
-  </ItemGroup>
-  <ItemGroup>
-    <Media Include="Assets\Data\MP3\10002.MP3">
-      <Filter>资产\Data\MP3</Filter>
-    </Media>
-    <Media Include="Assets\Data\MP3\10003.MP3">
-      <Filter>资产\Data\MP3</Filter>
-    </Media>
-    <Media Include="Assets\Data\MP3\10004.MP3">
-      <Filter>资产\Data\MP3</Filter>
-    </Media>
-    <Media Include="Assets\Data\MP3\10005.MP3">
-      <Filter>资产\Data\MP3</Filter>
-    </Media>
-    <Media Include="Assets\Data\MP3\10006.MP3">
-      <Filter>资产\Data\MP3</Filter>
-    </Media>
-    <Media Include="Assets\Data\MP3\10007.MP3">
-      <Filter>资产\Data\MP3</Filter>
-    </Media>
-    <Media Include="Assets\Data\MP3\10008.MP3">
-      <Filter>资产\Data\MP3</Filter>
-    </Media>
-    <Media Include="Assets\Data\MP3\10009.MP3">
-      <Filter>资产\Data\MP3</Filter>
-    </Media>
-    <Media Include="Assets\Data\MP3\10010.MP3">
-      <Filter>资产\Data\MP3</Filter>
-    </Media>
-    <Media Include="Assets\Data\MP3\10011.MP3">
-      <Filter>资产\Data\MP3</Filter>
-    </Media>
-    <Media Include="Assets\Data\MP3\10012.MP3">
-      <Filter>资产\Data\MP3</Filter>
-    </Media>
-    <Media Include="Assets\Data\MP3\10013.MP3">
-      <Filter>资产\Data\MP3</Filter>
-    </Media>
-  </ItemGroup>
   <ItemGroup>
     <Image Include="Assets\Square71x71Logo.scale-100.png">
       <Filter>资产</Filter>

+ 103 - 60
winphone/SDLPal/WinPhoneUtil.cpp

@@ -1,70 +1,113 @@
 #include <wrl.h>
 #include <string>
 #include <DXGI.h>
+#include <ppltasks.h>
 
-//#include <stdio.h>
-//#include <share.h>
-
-//static const char *
-//GetRootPath()
-//{
-//	static char buf[1024] = "";
-//	if (buf[0] == '\0')
-//	{
-//		Platform::String^ localfolder = Windows::Storage::ApplicationData::Current->LocalFolder->Path;
-//		const char16 *begin = localfolder->Begin();
-//		WideCharToMultiByte(CP_ACP, 0, begin, -1, buf, 1024, NULL, FALSE);
-//	}
-//	return buf;
-//}
-//
-//static const char *
-//GetInstallPath()
-//{
-//	static char buf[1024] = "";
-//	if (buf[0] == '\0')
-//	{
-//		Platform::String^ installfolder = Windows::ApplicationModel::Package::Current->InstalledLocation->Path;
-//		const char16 *begin = installfolder->Begin();
-//		WideCharToMultiByte(CP_ACP, 0, begin, -1, buf, 1024, NULL, FALSE);
-//	}
-//	return buf;
-//}
-//
-//extern "C" FILE *
-//MY_fopen(const char *path, const char *mode)
-//{
-//	return fopen(path, mode);
-//
-//	const char *p = GetRootPath();
-//	char buf[1024];
-//	_snprintf_s(buf, 1024, "%s\\%s", p, path);
-//	FILE *fp = _fsopen(buf, mode, _SH_DENYNO);
-//	if (fp == NULL)
-//	{
-//		p = GetInstallPath();
-//		_snprintf_s(buf, 1024, "%s\\%s", p, path);
-//		fp = _fsopen(buf, mode, _SH_DENYNO);
-//	}
-//	if (fp == NULL)
-//	{
-//		p = GetRootPath();
-//		_snprintf_s(buf, 1024, "%s\\Shared\\%s", p, path);
-//		fp = _fsopen(buf, mode, _SH_DENYNO);
-//	}
-//	return fp;
-//}
-
-static std::string g_savepath;
+#define PAL_PATH_NAME	"SDLPAL"
+
+static std::string g_savepath, g_basepath;
+
+template<typename T>
+static bool WaitOnTask(T task, int64 wait_timeout)
+{
+	auto start = GetTickCount64();
+	while (!task.is_done() && (int64)(GetTickCount64() - start) <= wait_timeout)
+		Sleep(1);
+	return task.is_done();
+}
+
+static void ConvertString(Platform::String^ src, std::string& dst)
+{
+	int len = WideCharToMultiByte(CP_ACP, 0, src->Begin(), -1, nullptr, 0, nullptr, nullptr);
+	dst.resize(len - 1);
+	WideCharToMultiByte(CP_ACP, 0, src->Begin(), -1, (char*)dst.data(), len, nullptr, nullptr);
+}
+
+static bool CheckGamePath(Windows::Storage::StorageFolder^ root)
+{
+	Platform::String^ required_files[] = {
+		L"ABC.MKF", L"BALL.MKF", L"DATA.MKF", L"F.MKF", L"FBP.MKF",
+		L"FIRE.MKF", L"GOP.MKF", L"MAP.MKF", L"MGO.MKF", L"PAT.MKF",
+		L"RGM.MKF", L"RNG.MKF", L"SSS.MKF"
+	};
+	Platform::String^ optional_required_files[] = {
+		L"VOC.MKF", L"SOUNDS.MKF"
+	};
+	/* The words.dat & m.msg may be configurable in the future, so not check here */
+
+	/* Try to get the path */
+	auto foldertask = concurrency::create_task(root->GetFolderAsync(PAL_PATH_NAME));
+	if (!WaitOnTask(foldertask, 500)) return false;		// Wait for 500ms max
+
+	try
+	{
+		/* Check the access right of necessary files */
+		auto folder = foldertask.get();
+		for (int i = 0; i < 13; i++)
+		{
+			auto filetask = concurrency::create_task(foldertask.get()->GetFileAsync(required_files[i]));
+			if (!WaitOnTask(filetask, 500) || _waccess_s(filetask.get()->Path->Begin(), 2)) return false;
+		}
+		for (int i = 0; i < 2; i++)
+		{
+			auto filetask = concurrency::create_task(foldertask.get()->GetFileAsync(optional_required_files[i]));
+			if (WaitOnTask(filetask, 500) && _waccess_s(filetask.get()->Path->Begin(), 2) == 0) return true;
+		}
+	}
+	catch(Platform::Exception^)
+	{ /* Accessing SD card failed, or required file is missing, or access is denied */ }
+	return false;
+}
+
+extern "C"
+LPCSTR UTIL_WP_BasePath(VOID)
+{
+	if (g_basepath.empty())
+	{
+		auto enumtask = concurrency::create_task(Windows::Storage::KnownFolders::RemovableDevices->GetFoldersAsync());
+		if (WaitOnTask(enumtask, 1000))		// Wait for 1000ms max
+		{
+			auto folderiter = enumtask.get()->First();
+			while (folderiter->HasCurrent)
+			{
+				if (CheckGamePath(folderiter->Current))
+				{
+					/* Folder examination succeeded */
+					auto folder = folderiter->Current->Path;
+					if (folder->End()[-1] != L'\\') folder += "\\";
+					folder += PAL_PATH_NAME "\\";
+					ConvertString(folder, g_basepath);
+
+					/* Check whether the folder is writable */
+					FILE* fp;
+					if (_wfopen_s(&fp, (folder + "sdlpal.rpg")->Begin(), L"w") == 0)
+					{
+						g_savepath = g_basepath;
+						fclose(fp);
+					}
+					break;
+				}
+				folderiter->MoveNext();
+			}
+		}
+
+		if (g_basepath.empty())
+		{
+			g_basepath.assign("Assets\\Data\\");
+		}
+	}
+	return g_basepath.c_str();
+}
 
 extern "C"
 LPCSTR UTIL_WP_SavePath(VOID)
 {
-	auto localfolder = Windows::Storage::ApplicationData::Current->LocalFolder->Path;
-	int len = WideCharToMultiByte(CP_ACP, 0, localfolder->Begin(), -1, nullptr, 0, nullptr, nullptr);
-	g_savepath.resize(len);
-	WideCharToMultiByte(CP_ACP, 0, localfolder->Begin(), -1, (char*)g_savepath.data(), len, nullptr, nullptr);
-	const_cast<char*>(g_savepath.data())[len - 1] = '\\';
+	if (g_savepath.empty())
+	{
+		auto localfolder = Windows::Storage::ApplicationData::Current->LocalFolder->Path;
+		if (localfolder->End()[-1] != L'\\') localfolder += "\\";
+		ConvertString(localfolder, g_savepath);
+	}
 	return g_savepath.c_str();
 }
 
@@ -98,4 +141,4 @@ UTIL_WP_GetScreenSize_exit:
 	if (pFactory) pFactory->Release();
 
 	return retval;
-}
+}

+ 1 - 0
winphone/SDLPalLib/SDLPalLib.vcxproj

@@ -27,6 +27,7 @@
     <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion>
     <ApplicationType>Windows Phone</ApplicationType>
     <ApplicationTypeRevision>8.1</ApplicationTypeRevision>
+    <ProjectName>SDLPalCore</ProjectName>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

winphone/SDLPalLib/SDLPalLib.vcxproj.filters → winphone/SDLPalCore/SDLPalCore.vcxproj.filters