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 10 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