Browse Source

[WIP] Various change for refactor

1. Move extra-line settings from configuration file to message file, so that the message file writer can determine the best value.
2. Fix MP3 play bug in WP.
3. The configuration file is no loaded from 'SAVE' folder rather than 'GAME' folder.
4. Initial refactor for platform-specific setting, and the win32 related files are moved into the 'win32' folder.
5. For WIN32 version, an initial setting dialog is added.
6. Overlay bitmap is embedded into the program.
7. Fix buffer overflow in text.c.
8. Optimize the lock operation.
louyihua 8 years ago
parent
commit
cc1edf8f0d
21 changed files with 4503 additions and 911 deletions
  1. 295 294
      global.c
  2. 11 2
      global.h
  3. 2 2
      itemmenu.c
  4. 2 2
      magicmenu.c
  5. 9 0
      main.c
  6. 3 0
      makemessage.py
  7. 2 2
      mp3play.c
  8. 2745 0
      overlay.c
  9. 1 1
      script.c
  10. 2 20
      sdlpal.cfg.example
  11. 0 1
      sdlpal.rc
  12. 0 341
      sdlpal.vcxproj
  13. 4 4
      text.c
  14. 18 2
      util.h
  15. 30 25
      video.c
  16. 44 0
      win32/resource.h
  17. 476 0
      win32/sdlpal.rc
  18. 1 7
      sdlpal.sln
  19. 344 0
      win32/sdlpal.vcxproj
  20. 220 208
      sdlpal.vcxproj.filters
  21. 294 0
      win32/win32.cpp

+ 295 - 294
global.c

@@ -48,6 +48,301 @@ CONFIGURATION gConfig;
       DO_BYTESWAP(buf, size);                                    \
    } while(0)
 
+VOID
+PAL_LoadConfig(
+   BOOL fFromFile
+)
+{
+	FILE     *fp;
+	CODEPAGE  iCodePage = CP_BIG5;		// Default for BIG5
+	DWORD     dwScreenWidth = 0;
+	DWORD     dwScreenHeight = 0;
+	DWORD     dwFullScreen = FALSE;
+	DWORD     dwKeepAspectRatio = TRUE;
+	DWORD     dwIsDOS = 1;				// Default for DOS
+	DWORD     dwUseEmbeddedFonts = 1;	// Default for using embedded fonts in DOS version
+	DWORD     dwUseSurroundOPL = 1;		// Default for using surround opl
+	DWORD     dwUseStereo = 1;			// Default for stereo audio
+#if PAL_HAS_TOUCH
+	DWORD     dwUseTouchOverlay = UTIL_TouchEnabled();
+#endif
+	float     flSurroundOPLOffset = 384.0f;// Default for 384.0
+	INT       iSampleRate = 44100;		// Default for 44100 Hz
+	INT       iOPLSampleRate = 49716;	// Default for 49716 Hz
+	INT       iResampleQuality = RESAMPLER_QUALITY_MAX;	// Default to maximum quality
+	INT       iAudioBufferSize = PAL_AUDIO_DEFAULT_BUFFER_SIZE;
+	INT       iVolume = 100;				// Default for 100%
+	MUSICTYPE eMusicType = MUSIC_RIX;
+	MUSICTYPE eCDType = MUSIC_OGG;
+	OPLTYPE   eOPLType = OPL_DOSBOX;
+	SCREENLAYOUT screen_layout = {
+		// Equipment Screen
+		PAL_XY(8, 8), PAL_XY(2, 95), PAL_XY(5, 70), PAL_XY(51, 57),
+		{ PAL_XY(92, 11), PAL_XY(92, 33), PAL_XY(92, 55), PAL_XY(92, 77), PAL_XY(92, 99), PAL_XY(92, 121) },
+		{ PAL_XY(130, 11), PAL_XY(130, 33), PAL_XY(130, 55), PAL_XY(130, 77), PAL_XY(130, 99), PAL_XY(130, 121) },
+		{ PAL_XY(226, 10), PAL_XY(226, 32), PAL_XY(226, 54), PAL_XY(226, 76), PAL_XY(226, 98) },
+		{ PAL_XY(260, 14), PAL_XY(260, 36), PAL_XY(260, 58), PAL_XY(260, 80), PAL_XY(260, 102) },
+
+		// Status Screen
+		PAL_XY(110, 8), PAL_XY(110, 30), PAL_XY(6, 6),  PAL_XY(6, 32),  PAL_XY(6, 54),  PAL_XY(6, 76),
+		{ PAL_XY(6, 98),   PAL_XY(6, 118),  PAL_XY(6, 138),  PAL_XY(6, 158),  PAL_XY(6, 178) },
+		PAL_XY(58, 6), PAL_XY(58, 15), PAL_XY(0, 0), PAL_XY(54, 35), PAL_XY(42, 56),
+		PAL_XY(63, 61), PAL_XY(65, 58), PAL_XY(42, 78), PAL_XY(63, 83), PAL_XY(65, 80),
+		{ PAL_XY(42, 102), PAL_XY(42, 122), PAL_XY(42, 142), PAL_XY(42, 162), PAL_XY(42, 182) },
+		{ PAL_XY(189, -1), PAL_XY(247, 39), PAL_XY(251, 101), PAL_XY(201, 133), PAL_XY(141, 141), PAL_XY(81, 125) },
+		{ PAL_XY(195, 38), PAL_XY(253, 78), PAL_XY(257, 140), PAL_XY(207, 172), PAL_XY(147, 180), PAL_XY(87, 164) },
+		{ PAL_XY(185, 58), PAL_XY(185, 76), PAL_XY(185, 94), PAL_XY(185, 112), PAL_XY(185, 130), PAL_XY(185, 148), PAL_XY(185, 166), PAL_XY(185, 184), PAL_XY(185, 184), PAL_XY(185, 184) },
+
+		// Extra Lines
+		PAL_XY(0, 0), PAL_XY(0, 0)
+	};
+
+	if (fFromFile && (fp = fopen(va("%ssdlpal.cfg", PAL_SAVE_PREFIX), "r")))
+	{
+		PAL_LARGE char buf[512];
+
+		//
+		// Load the configuration data
+		//
+		while (fgets(buf, 512, fp) != NULL)
+		{
+			char *p = buf;
+
+			//
+			// Skip leading spaces
+			//
+			while (*p && isspace(*p)) p++;
+
+			//
+			// Skip comments
+			//
+			if (*p && *p != '#')
+			{
+				char *ptr;
+				if (ptr = strchr(p, '='))
+				{
+					char *end = ptr - 1;
+					*ptr++ = 0;
+
+					//
+					// Skip tailing & leading spaces
+					//
+					while (isspace(*end) && end >= p) *end-- = 0;
+
+					if (SDL_strcasecmp(p, "CODEPAGE") == 0)
+					{
+						sscanf(ptr, "%d", &iCodePage);
+						if (iCodePage < 0) iCodePage = 0;
+						if (iCodePage >= CP_MAX) iCodePage = CP_MAX - 1;
+					}
+					else if (SDL_strcasecmp(p, "DOS") == 0)
+					{
+						sscanf(ptr, "%u", &dwIsDOS);
+					}
+					else if (SDL_strcasecmp(p, "USEEMBEDDEDFONTS") == 0)
+					{
+						sscanf(ptr, "%u", &dwUseEmbeddedFonts);
+					}
+					else if (SDL_strcasecmp(p, "USESURROUNDOPL") == 0)
+					{
+						sscanf(ptr, "%u", &dwUseSurroundOPL);
+					}
+					else if (SDL_strcasecmp(p, "STEREO") == 0)
+					{
+						sscanf(ptr, "%u", &dwUseStereo);
+					}
+					else if (SDL_strcasecmp(p, "SAMPLERATE") == 0)
+					{
+						sscanf(ptr, "%d", &iSampleRate);
+						if (iSampleRate > PAL_MAX_SAMPLERATE) iSampleRate = PAL_MAX_SAMPLERATE;
+					}
+					else if (SDL_strcasecmp(p, "OPLSAMPLERATE") == 0)
+					{
+						sscanf(ptr, "%d", &iOPLSampleRate);
+					}
+					else if (SDL_strcasecmp(p, "RESAMPLEQUALITY") == 0)
+					{
+						sscanf(ptr, "%d", &iResampleQuality);
+					}
+					else if (SDL_strcasecmp(p, "SURROUNDOPLOFFSET") == 0)
+					{
+						sscanf(ptr, "%f", &flSurroundOPLOffset);
+					}
+					else if (SDL_strcasecmp(p, "WINDOWWIDTH") == 0)
+					{
+						sscanf(ptr, "%u", &dwScreenWidth);
+					}
+					else if (SDL_strcasecmp(p, "WINDOWHEIGHT") == 0)
+					{
+						sscanf(ptr, "%u", &dwScreenHeight);
+					}
+					else if (SDL_strcasecmp(p, "FULLSCREEN") == 0)
+					{
+						sscanf(ptr, "%u", &dwFullScreen);
+					}
+					else if (SDL_strcasecmp(p, "KEEPASPECTRATIO") == 0)
+					{
+						sscanf(ptr, "%u", &dwKeepAspectRatio);
+					}
+#if PAL_HAS_TOUCH
+					else if (SDL_strcasecmp(p, "USETOUCHOVERLAY") == 0)
+					{
+						sscanf(ptr, "%d", &dwUseTouchOverlay);
+					}
+#endif
+					else if (SDL_strcasecmp(p, "AUDIOBUFFERSIZE") == 0)
+					{
+						sscanf(ptr, "%d", &iAudioBufferSize);
+						if (iAudioBufferSize > 32768)
+							iAudioBufferSize = 32768;
+						else if (iAudioBufferSize < 2)
+							iAudioBufferSize = 2;
+						if ((iAudioBufferSize & (iAudioBufferSize - 1)) != 0)
+						{
+							/* Make sure iAudioBufferSize is power of 2 */
+							int n = 0;
+							while (iAudioBufferSize) { iAudioBufferSize >>= 1; n++; }
+							iAudioBufferSize = 1 << (n - 1);
+						}
+					}
+					else if (SDL_strcasecmp(p, "VOLUME") == 0)
+					{
+						sscanf(ptr, "%d", &iVolume);
+						if (iVolume > 100)
+							iVolume = 100;
+						else if (iVolume < 0)
+							iVolume = 0;
+					}
+					else if (SDL_strcasecmp(p, "MESSAGEFILENAME") == 0)
+					{
+						int n = strlen(ptr);
+						if (n > 0 && ptr[n - 1] == '\n') ptr[--n] = 0;
+						if (n > 0 && ptr[n - 1] == '\r') ptr[--n] = 0;
+						if (n > 0) gConfig.pszMsgName = strdup(ptr);
+					}
+#if USE_RIX_EXTRA_INIT
+					else if (SDL_strcasecmp(p, "RIXEXTRAINIT") == 0)
+					{
+						int n = 1;
+						char *p;
+						for (p = ptr; *p < *end; p++)
+						{
+							if (*p == ',')
+								n++;
+						}
+						n &= ~0x1;
+
+						if (n > 0)
+						{
+							uint32_t *regs = malloc(sizeof(uint32_t) * (n >> 1));
+							uint8_t *vals = malloc(sizeof(uint8_t) * (n >> 1));
+							uint32_t d, i, v = 1;
+							if (regs && vals)
+							{
+								for (p = ptr, i = 0; *p < *end; p++, i++)
+								{
+									if (sscanf(p, "%u", &regs[i]) == 0) { v = 0; break; }
+									while (*p < *end && *p != ',') p++; p++;
+									if (sscanf(p, "%u", &d) == 0) { v = 0; break; }
+									while (*p < *end && *p != ',') p++;
+									vals[i] = (uint8_t)d;
+								}
+								if (v)
+								{
+									gConfig.pExtraFMRegs = regs;
+									gConfig.pExtraFMVals = vals;
+									gConfig.dwExtraLength = n >> 1;
+								}
+								else
+								{
+									free(regs);
+									free(vals);
+								}
+							}
+						}
+					}
+#endif
+					else if (SDL_strcasecmp(p, "CD") == 0)
+					{
+						char cd_type[32];
+						sscanf(ptr, "%31s", cd_type);
+						if (PAL_HAS_MP3 && SDL_strcasecmp(cd_type, "MP3") == 0)
+							eCDType = MUSIC_MP3;
+						else if (PAL_HAS_OGG && SDL_strcasecmp(cd_type, "OGG") == 0)
+							eCDType = MUSIC_OGG;
+						else if (PAL_HAS_SDLCD && SDL_strcasecmp(cd_type, "RAW") == 0)
+							eCDType = MUSIC_SDLCD;
+					}
+					else if (SDL_strcasecmp(p, "MUSIC") == 0)
+					{
+						char music_type[32];
+						sscanf(ptr, "%31s", music_type);
+						if (PAL_HAS_NATIVEMIDI && SDL_strcasecmp(music_type, "MIDI") == 0)
+							eMusicType = MUSIC_MIDI;
+						else if (PAL_HAS_MP3 && SDL_strcasecmp(music_type, "MP3") == 0)
+							eMusicType = MUSIC_MP3;
+						else if (PAL_HAS_OGG && SDL_strcasecmp(music_type, "OGG") == 0)
+							eMusicType = MUSIC_OGG;
+						else if (SDL_strcasecmp(music_type, "RIX") == 0)
+							eMusicType = MUSIC_RIX;
+					}
+					else if (SDL_strcasecmp(p, "OPL") == 0)
+					{
+						char opl_type[32];
+						sscanf(ptr, "%31s", opl_type);
+						if (SDL_strcasecmp(opl_type, "DOSBOX") == 0)
+							eOPLType = OPL_DOSBOX;
+						else if (SDL_strcasecmp(opl_type, "DOSBOXOLD") == 0)
+							eOPLType = OPL_DOSBOX_OLD;
+						else if (PAL_HAS_MAME && SDL_strcasecmp(opl_type, "MAME") == 0)
+							eOPLType = OPL_MAME;
+					}
+				}
+			}
+		}
+
+		UTIL_CloseFile(fp);
+	}
+
+	//
+	// Set configurable global options
+	//
+	gConfig.fIsWIN95 = dwIsDOS ? FALSE : TRUE;
+	gConfig.fUseEmbeddedFonts = dwIsDOS && dwUseEmbeddedFonts ? TRUE : FALSE;
+	gConfig.fUseSurroundOPL = dwUseStereo && dwUseSurroundOPL ? TRUE : FALSE;
+	gConfig.iAudioChannels = dwUseStereo ? 2 : 1;
+#if PAL_HAS_TOUCH
+	gConfig.fUseTouchOverlay = dwUseTouchOverlay ? TRUE : FALSE;
+#endif
+	gConfig.iSampleRate = iSampleRate;
+	gConfig.iOPLSampleRate = iOPLSampleRate;
+	gConfig.iResampleQuality = iResampleQuality;
+	gConfig.dSurroundOPLOffset = flSurroundOPLOffset;
+	gConfig.eMusicType = eMusicType;
+	gConfig.eCDType = eCDType;
+	gConfig.eOPLType = eOPLType;
+	gConfig.iCodePage = iCodePage;
+	gConfig.dwWordLength = 10;	// This is the default value for Chinese version
+	gConfig.wAudioBufferSize = (WORD)iAudioBufferSize;
+	gConfig.iVolume = SDL_MIX_MAXVOLUME * iVolume / 100;
+	if (UTIL_GetScreenSize(&dwScreenWidth, &dwScreenHeight))
+	{
+		gConfig.dwScreenWidth = dwScreenWidth;
+		gConfig.dwScreenHeight = dwScreenHeight;
+	}
+	else
+	{
+		gConfig.dwScreenWidth = PAL_DEFAULT_WINDOW_WIDTH;
+		gConfig.dwScreenHeight = PAL_DEFAULT_WINDOW_HEIGHT;
+	}
+#if SDL_VERSION_ATLEAST(2,0,0)
+	gConfig.fKeepAspectRatio = dwKeepAspectRatio ? TRUE : FALSE;
+#else
+	gConfig.fFullScreen = dwFullScreen ? TRUE : FALSE;
+#endif
+	gConfig.ScreenLayout = screen_layout;
+}
+
 INT
 PAL_InitGlobals(
    VOID
@@ -68,300 +363,6 @@ PAL_InitGlobals(
 
 --*/
 {
-   FILE     *fp;
-   CODEPAGE  iCodePage = CP_BIG5;		// Default for BIG5
-   DWORD     dwExtraMagicDescLines = 0;	// Default for PAL DOS/WIN95
-   DWORD     dwExtraItemDescLines = 0;	// Default for PAL DOS/WIN95
-   DWORD     dwScreenWidth = 0;
-   DWORD     dwScreenHeight = 0;
-   DWORD     dwFullScreen = FALSE;
-   DWORD     dwKeepAspectRatio = TRUE;
-   DWORD     dwIsDOS = 1;				// Default for DOS
-   DWORD     dwUseEmbeddedFonts = 1;	// Default for using embedded fonts in DOS version
-   DWORD     dwUseSurroundOPL = 1;		// Default for using surround opl
-   DWORD     dwUseStereo = 1;			// Default for stereo audio
-   float     flSurroundOPLOffset = 384.0f;// Default for 384.0
-   INT       iSampleRate = 44100;		// Default for 44100 Hz
-   INT       iOPLSampleRate = 49716;	// Default for 49716 Hz
-   INT       iResampleQuality = RESAMPLER_QUALITY_MAX;	// Default to maximum quality
-   INT       iAudioBufferSize = PAL_AUDIO_DEFAULT_BUFFER_SIZE;
-   INT       iVolume = 100;				// Default for 100%
-   MUSICTYPE eMusicType = MUSIC_RIX;
-   MUSICTYPE eCDType = PAL_HAS_SDLCD ? MUSIC_SDLCD : MUSIC_OGG;
-   OPLTYPE   eOPLType = OPL_DOSBOX;
-   SCREENLAYOUT screen_layout = {
-	   // Equipment Screen
-	   PAL_XY(8, 8), PAL_XY(2, 95), PAL_XY(5, 70), PAL_XY(51, 57),
-	   { PAL_XY(92, 11), PAL_XY(92, 33), PAL_XY(92, 55), PAL_XY(92, 77), PAL_XY(92, 99), PAL_XY(92, 121) },
-	   { PAL_XY(130, 11), PAL_XY(130, 33), PAL_XY(130, 55), PAL_XY(130, 77), PAL_XY(130, 99), PAL_XY(130, 121) },
-	   { PAL_XY(226, 10), PAL_XY(226, 32), PAL_XY(226, 54), PAL_XY(226, 76), PAL_XY(226, 98)  },
-	   { PAL_XY(260, 14), PAL_XY(260, 36), PAL_XY(260, 58), PAL_XY(260, 80), PAL_XY(260, 102) },
-
-	   // Status Screen
-	   PAL_XY(110, 8), PAL_XY(110, 30), PAL_XY(6, 6),  PAL_XY(6, 32),  PAL_XY(6, 54),  PAL_XY(6, 76),
-	   { PAL_XY(6, 98),   PAL_XY(6, 118),  PAL_XY(6, 138),  PAL_XY(6, 158),  PAL_XY(6, 178) },
-	   PAL_XY(58, 6), PAL_XY(58, 15), PAL_XY(0, 0), PAL_XY(54, 35), PAL_XY(42, 56),
-	   PAL_XY(63, 61), PAL_XY(65, 58), PAL_XY(42, 78), PAL_XY(63, 83), PAL_XY(65, 80),
-	   { PAL_XY(42, 102), PAL_XY(42, 122), PAL_XY(42, 142), PAL_XY(42, 162), PAL_XY(42, 182) },
-	   { PAL_XY(189, -1), PAL_XY(247, 39), PAL_XY(251, 101), PAL_XY(201, 133), PAL_XY(141, 141), PAL_XY(81, 125) },
-	   { PAL_XY(195, 38), PAL_XY(253, 78), PAL_XY(257, 140), PAL_XY(207, 172), PAL_XY(147, 180), PAL_XY(87, 164) },
-	   { PAL_XY(185, 58), PAL_XY(185, 76), PAL_XY(185, 94), PAL_XY(185, 112), PAL_XY(185, 130), PAL_XY(185, 148), PAL_XY(185, 166), PAL_XY(185, 184), PAL_XY(185, 184), PAL_XY(185, 184) },
-   };
-
-   if (fp = UTIL_OpenFileForMode("sdlpal.cfg", "r"))
-   {
-	   PAL_LARGE char buf[512];
-
-	   //
-	   // Load the configuration data
-	   //
-	   while (fgets(buf, 512, fp) != NULL)
-	   {
-		   char *p = buf;
-
-		   //
-		   // Skip leading spaces
-		   //
-		   while (*p && isspace(*p)) p++;
-
-		   //
-		   // Skip comments
-		   //
-		   if (*p && *p != '#')
-		   {
-			   char *ptr;
-			   if (ptr = strchr(p, '='))
-			   {
-				   char *end = ptr - 1;
-				   *ptr++ = 0;
-
-				   //
-				   // Skip tailing & leading spaces
-				   //
-				   while (isspace(*end) && end >= p) *end-- = 0;
-
-				   if (SDL_strcasecmp(p, "CODEPAGE") == 0)
-				   {
-					   sscanf(ptr, "%d", &iCodePage);
-					   if (iCodePage < 0) iCodePage = 0;
-					   if (iCodePage >= CP_MAX) iCodePage = CP_MAX - 1;
-				   }
-				   else if (SDL_strcasecmp(p, "EXTRAMAGICDESCLINES") == 0)
-				   {
-					   sscanf(ptr, "%u", &dwExtraMagicDescLines);
-				   }
-				   else if (SDL_strcasecmp(p, "EXTRAITEMDESCLINES") == 0)
-				   {
-					   sscanf(ptr, "%u", &dwExtraItemDescLines);
-				   }
-				   else if (SDL_strcasecmp(p, "DOS") == 0)
-				   {
-					   sscanf(ptr, "%u", &dwIsDOS);
-				   }
-				   else if (SDL_strcasecmp(p, "USEEMBEDDEDFONTS") == 0)
-				   {
-					   sscanf(ptr, "%u", &dwUseEmbeddedFonts);
-				   }
-				   else if (SDL_strcasecmp(p, "USESURROUNDOPL") == 0)
-				   {
-					   sscanf(ptr, "%u", &dwUseSurroundOPL);
-				   }
-				   else if (SDL_strcasecmp(p, "STEREO") == 0)
-				   {
-					   sscanf(ptr, "%u", &dwUseStereo);
-				   }
-				   else if (SDL_strcasecmp(p, "SAMPLERATE") == 0)
-				   {
-					   sscanf(ptr, "%d", &iSampleRate);
-					   if (iSampleRate > PAL_MAX_SAMPLERATE) iSampleRate = PAL_MAX_SAMPLERATE;
-				   }
-				   else if (SDL_strcasecmp(p, "OPLSAMPLERATE") == 0)
-				   {
-					   sscanf(ptr, "%d", &iOPLSampleRate);
-				   }
-				   else if (SDL_strcasecmp(p, "RESAMPLEQUALITY") == 0)
-				   {
-					   sscanf(ptr, "%d", &iResampleQuality);
-				   }
-				   else if (SDL_strcasecmp(p, "SURROUNDOPLOFFSET") == 0)
-				   {
-					   sscanf(ptr, "%f", &flSurroundOPLOffset);
-				   }
-				   else if (SDL_strcasecmp(p, "WINDOWWIDTH") == 0)
-				   {
-					   sscanf(ptr, "%u", &dwScreenWidth);
-				   }
-				   else if (SDL_strcasecmp(p, "WINDOWHEIGHT") == 0)
-				   {
-					   sscanf(ptr, "%u", &dwScreenHeight);
-				   }
-				   else if (SDL_strcasecmp(p, "FULLSCREEN") == 0)
-				   {
-					   sscanf(ptr, "%u", &dwFullScreen);
-				   }
-				   else if (SDL_strcasecmp(p, "KEEPASPECTRATIO") == 0)
-				   {
-					   sscanf(ptr, "%u", &dwKeepAspectRatio);
-				   }
-				   else if (SDL_strcasecmp(p, "AUDIOBUFFERSIZE") == 0)
-				   {
-					   sscanf(ptr, "%d", &iAudioBufferSize);
-					   if (iAudioBufferSize > 32768)
-						   iAudioBufferSize = 32768;
-					   else if (iAudioBufferSize < 2)
-						   iAudioBufferSize = 2;
-					   if ((iAudioBufferSize & (iAudioBufferSize - 1)) != 0)
-					   {
-						   /* Make sure iAudioBufferSize is power of 2 */
-						   int n = 0;
-						   while (iAudioBufferSize) { iAudioBufferSize >>= 1; n++; }
-						   iAudioBufferSize = 1 << (n - 1);
-					   }
-				   }
-				   else if (SDL_strcasecmp(p, "VOLUME") == 0)
-				   {
-					   sscanf(ptr, "%d", &iVolume);
-					   if (iVolume > 100)
-						   iVolume = 100;
-					   else if (iVolume < 0)
-						   iVolume = 0;
-				   }
-				   else if (SDL_strcasecmp(p, "MESSAGEFILENAME") == 0)
-				   {
-					   int n = strlen(ptr);
-					   if (n > 0 && ptr[n - 1] == '\n') ptr[--n] = 0;
-					   if (n > 0 && ptr[n - 1] == '\r') ptr[--n] = 0;
-					   if (n > 0) gConfig.pszMsgName = strdup(ptr);
-				   }
-#if USE_RIX_EXTRA_INIT
-				   else if (SDL_strcasecmp(p, "RIXEXTRAINIT") == 0)
-				   {
-					   int n = 1;
-					   char *p;
-					   for (p = ptr; *p < *end; p++)
-					   {
-						   if (*p == ',')
-							   n++;
-					   }
-					   n &= ~0x1;
-
-					   if (n > 0)
-					   {
-						   uint32_t *regs = malloc(sizeof(uint32_t) * (n >> 1));
-						   uint8_t *vals = malloc(sizeof(uint8_t) * (n >> 1));
-						   uint32_t d, i, v = 1;
-						   if (regs && vals)
-						   {
-							   for (p = ptr, i = 0; *p < *end; p++, i++)
-							   {
-								   if (sscanf(p, "%u", &regs[i]) == 0) { v = 0; break; }
-								   while (*p < *end && *p != ',') p++; p++;
-								   if (sscanf(p, "%u", &d) == 0) { v = 0; break; }
-								   while (*p < *end && *p != ',') p++;
-								   vals[i] = (uint8_t)d;
-							   }
-							   if (v)
-							   {
-								   gConfig.pExtraFMRegs = regs;
-								   gConfig.pExtraFMVals = vals;
-								   gConfig.dwExtraLength = n >> 1;
-							   }
-							   else
-							   {
-								   free(regs);
-								   free(vals);
-							   }
-						   }
-					   }
-				   }
-#endif
-				   else if (SDL_strcasecmp(p, "CD") == 0)
-				   {
-					   char cd_type[32];
-					   sscanf(ptr, "%31s", cd_type);
-					   if (PAL_HAS_MP3 && SDL_strcasecmp(cd_type, "MP3") == 0)
-						   eCDType = MUSIC_MP3;
-					   else if (PAL_HAS_OGG && SDL_strcasecmp(cd_type, "OGG") == 0)
-						   eCDType = MUSIC_OGG;
-					   else if (PAL_HAS_SDLCD && SDL_strcasecmp(cd_type, "RAW") == 0)
-						   eCDType = MUSIC_SDLCD;
-				   }
-				   else if (SDL_strcasecmp(p, "MUSIC") == 0)
-				   {
-					   char music_type[32];
-					   sscanf(ptr, "%31s", music_type);
-					   if (PAL_HAS_NATIVEMIDI && SDL_strcasecmp(music_type, "MIDI") == 0)
-						   eMusicType = MUSIC_MIDI;
-					   else if (PAL_HAS_MP3 && SDL_strcasecmp(music_type, "MP3") == 0)
-						   eMusicType = MUSIC_MP3;
-					   else if (PAL_HAS_OGG && SDL_strcasecmp(music_type, "OGG") == 0)
-						   eMusicType = MUSIC_OGG;
-					   else if (SDL_strcasecmp(music_type, "RIX") == 0)
-						   eMusicType = MUSIC_RIX;
-				   }
-				   else if (SDL_strcasecmp(p, "OPL") == 0)
-				   {
-					   char opl_type[32];
-					   sscanf(ptr, "%31s", opl_type);
-					   if (SDL_strcasecmp(opl_type, "DOSBOX") == 0)
-						   eOPLType = OPL_DOSBOX;
-					   else if (SDL_strcasecmp(opl_type, "DOSBOXOLD") == 0)
-						   eOPLType = OPL_DOSBOX_OLD;
-					   else if (PAL_HAS_MAME && SDL_strcasecmp(opl_type, "MAME") == 0)
-						   eOPLType = OPL_MAME;
-				   }
-			   }
-		   }
-	   }
-
-	   UTIL_CloseFile(fp);
-   }
-
-   //
-   // Set configurable global options
-   //
-   gConfig.fIsWIN95 = dwIsDOS ? FALSE : TRUE;
-   gConfig.fUseEmbeddedFonts = dwIsDOS && dwUseEmbeddedFonts ? TRUE : FALSE;
-   gConfig.fUseSurroundOPL = dwUseStereo && dwUseSurroundOPL ? TRUE : FALSE;
-   gConfig.iAudioChannels = dwUseStereo ? 2 : 1;
-   gConfig.iSampleRate = iSampleRate;
-   gConfig.iOPLSampleRate = iOPLSampleRate;
-   gConfig.iResampleQuality = iResampleQuality;
-   gConfig.dSurroundOPLOffset = flSurroundOPLOffset;
-   gConfig.eMusicType = eMusicType;
-   gConfig.eCDType = eCDType;
-   gConfig.eOPLType = eOPLType;
-   gConfig.iCodePage = iCodePage;
-   gConfig.dwWordLength = 10;	// This is the default value for Chinese version
-   gConfig.dwExtraMagicDescLines = dwExtraMagicDescLines;
-   gConfig.dwExtraItemDescLines = dwExtraItemDescLines;
-   gConfig.wAudioBufferSize = (WORD)iAudioBufferSize;
-   gConfig.iVolume = SDL_MIX_MAXVOLUME * iVolume / 100;
-#if defined(NDS) || defined(__SYMBIAN32__) || defined(GEKKO) || defined(PSP) || defined(GEKKO) || defined(GPH) || defined(DINGOO) || defined(__ANDROID__)
-   gConfig.dwScreenWidth = PAL_DEFAULT_WINDOW_WIDTH;
-   gConfig.dwScreenHeight = PAL_DEFAULT_WINDOW_HEIGHT;
-#elif defined(__WINPHONE__) || defined(__IOS__)
-   if (UTIL_GetScreenSize(&dwScreenWidth, &dwScreenHeight))
-   {
-      gConfig.dwScreenWidth = dwScreenWidth;
-      gConfig.dwScreenHeight = dwScreenHeight;
-   }
-   else
-   {
-      gConfig.dwScreenWidth = PAL_DEFAULT_WINDOW_WIDTH;
-      gConfig.dwScreenHeight = PAL_DEFAULT_WINDOW_HEIGHT;
-   }
-#else
-   gConfig.dwScreenWidth = dwScreenWidth ? dwScreenWidth : PAL_DEFAULT_WINDOW_WIDTH;
-   gConfig.dwScreenHeight = dwScreenHeight ? dwScreenHeight : (dwFullScreen ? PAL_DEFAULT_FULLSCREEN_HEIGHT : PAL_DEFAULT_WINDOW_HEIGHT);
-#endif
-#if SDL_VERSION_ATLEAST(2,0,0)
-   gConfig.fKeepAspectRatio = dwKeepAspectRatio ? TRUE : FALSE;
-#else
-   gConfig.fFullScreen = dwFullScreen ? TRUE : FALSE;
-#endif
-   gConfig.ScreenLayout = screen_layout;
-
    //
    // Set decompress function
    //

+ 11 - 2
global.h

@@ -651,6 +651,9 @@ typedef struct tagSCREENLAYOUT
 	PAL_POS          RoleEquipImageBoxes[MAX_PLAYER_EQUIPMENTS];
 	PAL_POS          RoleEquipNames[MAX_PLAYER_EQUIPMENTS];
 	PAL_POS          RolePoisonNames[MAX_POISONS];
+
+	PAL_POS          ExtraItemDescLines;
+	PAL_POS          ExtraMagicDescLines;
 } SCREENLAYOUT;
 
 typedef struct tagCONFIGURATION
@@ -673,8 +676,6 @@ typedef struct tagCONFIGURATION
 #endif
 	CODEPAGE         iCodePage;
 	DWORD            dwWordLength;
-	DWORD            dwExtraMagicDescLines;
-	DWORD            dwExtraItemDescLines;
 	DWORD            dwScreenWidth;
 	DWORD            dwScreenHeight;
 	double           dSurroundOPLOffset;
@@ -697,10 +698,18 @@ typedef struct tagCONFIGURATION
 #endif
 	BOOL             fEnableJoyStick;
 	BOOL             fUseCustomScreenLayout;
+#if PAL_HAS_TOUCH
+	BOOL             fUseTouchOverlay;
+#endif
 } CONFIGURATION, *LPCONFIGURATION;
 
 extern CONFIGURATION gConfig;
 
+VOID
+PAL_LoadConfig(
+   BOOL fFromFile
+);
+
 INT
 PAL_InitGlobals(
    VOID

+ 2 - 2
itemmenu.c

@@ -53,11 +53,11 @@ PAL_ItemSelectMenuUpdate(
    static WORD        wPrevImageIndex = 0xFFFF;
    const int          iItemsPerLine = 34 / gConfig.dwWordLength;
    const int          iItemTextWidth = 8 * gConfig.dwWordLength + 20;
-   const int          iLinesPerPage = 7 - gConfig.dwExtraItemDescLines;
+   const int          iLinesPerPage = 7 - gConfig.ScreenLayout.ExtraItemDescLines;
    const int          iCursorXOffset = gConfig.dwWordLength * 5 / 2;
    const int          iAmountXOffset = gConfig.dwWordLength * 8 + 1;
    const int          iPageLineOffset = (iLinesPerPage + 1) / 2;
-   const int          iPictureYOffset = (gConfig.dwExtraItemDescLines > 1) ? (gConfig.dwExtraItemDescLines - 1) * 16 : 0;
+   const int          iPictureYOffset = (gConfig.ScreenLayout.ExtraItemDescLines > 1) ? (gConfig.ScreenLayout.ExtraItemDescLines - 1) * 16 : 0;
 
    //
    // Process input

+ 2 - 2
magicmenu.c

@@ -58,8 +58,8 @@ PAL_MagicSelectionMenuUpdate(
    WORD        wScript;
    const int   iItemsPerLine = 32 / gConfig.dwWordLength;
    const int   iItemTextWidth = 8 * gConfig.dwWordLength + 7;
-   const int   iLinesPerPage = 5 - gConfig.dwExtraMagicDescLines;
-   const int   iBoxYOffset = gConfig.dwExtraMagicDescLines * 16;
+   const int   iLinesPerPage = 5 - gConfig.ScreenLayout.ExtraMagicDescLines;
+   const int   iBoxYOffset = gConfig.ScreenLayout.ExtraMagicDescLines * 16;
    const int   iCursorXOffset = gConfig.dwWordLength * 5 / 2;
    const int   iPageLineOffset = iLinesPerPage / 2;
 

+ 9 - 0
main.c

@@ -191,6 +191,7 @@ PAL_Shutdown(
 #elif defined(__WINPHONE__)
 	longjmp(g_exit_jmp_env, LONGJMP_EXIT_CODE);
 #endif
+	UTIL_Platform_Quit();
 }
 
 VOID
@@ -541,6 +542,14 @@ main(
    putenv("SDL_VIDEODRIVER=directx");
 #endif
 
+   PAL_LoadConfig(TRUE);
+
+   //
+   // Platform-specific initialization
+   //
+   if (UTIL_Platform_Init(argc, argv) != 0)
+	   return -1;
+
    //
    // Initialize everything
    //

+ 3 - 0
makemessage.py

@@ -194,6 +194,9 @@ def main():
     output += "78=185,184\n"
     output += "79=185,184\n"
     output += "80=185,184\n"
+    output += "# 81 .. 82 are extra description lines in the item (81) & magic (82) menu, where the first value specifies the lines and the second value should be zero\n"
+    output += "81=2,0"
+    output += "82=1,0"
     output += "[END LAYOUT]\n\n"
 
     output += "# This section contains the words used by the game.\n"

+ 2 - 2
mp3play.c

@@ -116,9 +116,9 @@ MP3_Play(
 
 	if (iNum > 0)
 	{
-		if ((player->pMP3 = mad_openFile(va("%s/mp3/%.2d.mp3", PAL_PREFIX, iNum), SOUND_GetAudioSpec(), gConfig.iResampleQuality)) == NULL)
+		if ((player->pMP3 = mad_openFile(va("%smp3/%.2d.mp3", PAL_PREFIX, iNum), SOUND_GetAudioSpec(), gConfig.iResampleQuality)) == NULL)
 		{
-			player->pMP3 = mad_openFile(va("%s/MP3/%.2d.MP3", PAL_PREFIX, iNum), SOUND_GetAudioSpec(), gConfig.iResampleQuality);
+			player->pMP3 = mad_openFile(va("%sMP3/%.2d.MP3", PAL_PREFIX, iNum), SOUND_GetAudioSpec(), gConfig.iResampleQuality);
 		}
 
 		if (player->pMP3)

File diff suppressed because it is too large
+ 2745 - 0
overlay.c


+ 1 - 1
script.c

@@ -3474,7 +3474,7 @@ begin:
 	   if (gConfig.fIsWIN95)
 	   {
 		   int XBase = (wEventObjectID & PAL_ITEM_DESC_BOTTOM) ? 75 : 100;
-		   int YBase = (wEventObjectID & PAL_ITEM_DESC_BOTTOM) ? 150 - gConfig.dwExtraItemDescLines * 16 : 3;
+		   int YBase = (wEventObjectID & PAL_ITEM_DESC_BOTTOM) ? 150 - gConfig.ScreenLayout.ExtraItemDescLines * 16 : 3;
 		   int iDescLine = (wEventObjectID & ~PAL_ITEM_DESC_BOTTOM);
 
 		   if (gConfig.pszMsgName)

+ 2 - 20
sdlpal.cfg.example

@@ -8,14 +8,6 @@
 #           2 for shift-jis.
 #CodePage=0
 
-# ExtraMagicDescLines: Idicates number of extra lines for magic description,
-#                      0 for chinese version (default), 1 for japanese version.
-#ExtraMagicDescLines=0
-
-# ExtraItemDescLines: Idicates number of extra lines for item description,
-#                     0 for chinese version (default), 2 for japanese version.
-#ExtraItemDescLines=0
-
 # DOS: Indicates whether to use DOS-version resources or WIN-version resources.
 #      Non-zero for DOS-version (default), zero for WIN95-version.
 #DOS=1
@@ -98,15 +90,5 @@
 #                  this value is ignored.
 #KeepAspectRatio=1
 
-# MessageFileName: Indicates whether to use external message & word files. Only need to specify
-#                  main file name, the extensions are automatically appended by SDLPAL. The
-#                  '.msg' file is the message file, the '.idx' file is the index file, and the
-#                  '.wrd' file is the word file. All files have the format '<idx>=<content>',
-#                  where the start value of <idx> are 0 for the index file and 1 for the other
-#                  two files. Note that, the <content> of the index file is a series of numbers
-#                  spearated by commas, and each number is one of the <idx>s in the message
-#                  file, while value '0' means wait for key and value '-1' means end. And the
-#                  <idx> of the index file is the value of the first 0xFFFF instruction of one
-#                  dialog in SSS.MKF. By default, this option is disabled. All such files should
-#                  be UTF-8 encoded, without leading BOM bytes.
-#MessageFileName=jm
+# MessageFileName: Indicates whether to use external message files.
+#MessageFileName=jm.msg

+ 0 - 1
sdlpal.rc

@@ -1 +0,0 @@
-101 ICON "sdlpal.ico"

+ 0 - 341
sdlpal.vcxproj

@@ -1,341 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{837BDF47-9375-4C30-866B-07E262E94A01}</ProjectGuid>
-    <RootNamespace>sdlpal</RootNamespace>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <PlatformToolset>v120_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <PlatformToolset>v120_xp</PlatformToolset>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <IncludePath>..\SDL2-2.0.3\include;$(IncludePath)</IncludePath>
-    <LibraryPath>..\SDL2-2.0.3\lib\x86;$(LibraryPath)</LibraryPath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <IncludePath>..\SDL2-2.0.3\include;$(IncludePath)</IncludePath>
-    <LibraryPath>..\SDL2-2.0.3\lib\x86;$(LibraryPath)</LibraryPath>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>Win32</TargetEnvironment>
-      <TypeLibraryName>.\Release/sdlpal_sdl2.tlb</TypeLibraryName>
-      <HeaderFileName>
-      </HeaderFileName>
-    </Midl>
-    <ClCompile>
-      <AdditionalIncludeDirectories>.\liboggvorbis\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0804</Culture>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>winmm.lib;sdl2.lib;sdl2main.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <SubSystem>Windows</SubSystem>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-    </Link>
-    <Bscmake />
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>Win32</TargetEnvironment>
-      <TypeLibraryName>.\Debug/sdlpal_sdl2.tlb</TypeLibraryName>
-      <HeaderFileName>
-      </HeaderFileName>
-    </Midl>
-    <ClCompile>
-      <AdditionalIncludeDirectories>.\liboggvorbis\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
-      <Optimization>Disabled</Optimization>
-    </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0804</Culture>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>winmm.lib;sdl2.lib;sdl2main.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Windows</SubSystem>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-    <Bscmake />
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="adplug\adlibemu.c" />
-    <ClCompile Include="adplug\dbemuopl.cpp" />
-    <ClCompile Include="adplug\dbopl.cpp">
-      <InlineFunctionExpansion Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AnySuitable</InlineFunctionExpansion>
-      <IntrinsicFunctions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</IntrinsicFunctions>
-      <FavorSizeOrSpeed Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Speed</FavorSizeOrSpeed>
-      <OmitFramePointers Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</OmitFramePointers>
-    </ClCompile>
-    <ClCompile Include="adplug\demuopl.cpp" />
-    <ClCompile Include="battle.c" />
-    <ClCompile Include="ending.c" />
-    <ClCompile Include="fight.c" />
-    <ClCompile Include="font.c" />
-    <ClCompile Include="game.c" />
-    <ClCompile Include="getopt.c" />
-    <ClCompile Include="global.c" />
-    <ClCompile Include="input.c" />
-    <ClCompile Include="itemmenu.c" />
-    <ClCompile Include="liboggvorbis\src\analysis.c" />
-    <ClCompile Include="liboggvorbis\src\bitrate.c" />
-    <ClCompile Include="liboggvorbis\src\bitwise.c" />
-    <ClCompile Include="liboggvorbis\src\block.c" />
-    <ClCompile Include="liboggvorbis\src\codebook.c" />
-    <ClCompile Include="liboggvorbis\src\envelope.c" />
-    <ClCompile Include="liboggvorbis\src\floor0.c" />
-    <ClCompile Include="liboggvorbis\src\floor1.c" />
-    <ClCompile Include="liboggvorbis\src\framing.c" />
-    <ClCompile Include="liboggvorbis\src\info.c" />
-    <ClCompile Include="liboggvorbis\src\lookup.c" />
-    <ClCompile Include="liboggvorbis\src\lpc.c" />
-    <ClCompile Include="liboggvorbis\src\lsp.c" />
-    <ClCompile Include="liboggvorbis\src\mapping0.c" />
-    <ClCompile Include="liboggvorbis\src\mdct.c" />
-    <ClCompile Include="liboggvorbis\src\psy.c" />
-    <ClCompile Include="liboggvorbis\src\registry.c" />
-    <ClCompile Include="liboggvorbis\src\res0.c" />
-    <ClCompile Include="liboggvorbis\src\sharedbook.c" />
-    <ClCompile Include="liboggvorbis\src\smallft.c" />
-    <ClCompile Include="liboggvorbis\src\synthesis.c" />
-    <ClCompile Include="liboggvorbis\src\vorbisenc.c" />
-    <ClCompile Include="liboggvorbis\src\vorbisfile.c" />
-    <ClCompile Include="liboggvorbis\src\window.c" />
-    <ClCompile Include="magicmenu.c" />
-    <ClCompile Include="main.c" />
-    <ClCompile Include="map.c" />
-    <ClCompile Include="midi.c" />
-    <ClCompile Include="mp3play.c" />
-    <ClCompile Include="oggplay.c" />
-    <ClCompile Include="palcommon.c" />
-    <ClCompile Include="palette.c" />
-    <ClCompile Include="play.c" />
-    <ClCompile Include="res.c" />
-    <ClCompile Include="resampler.c" />
-    <ClCompile Include="rixplay.cpp" />
-    <ClCompile Include="rngplay.c" />
-    <ClCompile Include="scene.c" />
-    <ClCompile Include="script.c" />
-    <ClCompile Include="sound.c" />
-    <ClCompile Include="text.c" />
-    <ClCompile Include="ui.c" />
-    <ClCompile Include="uibattle.c" />
-    <ClCompile Include="uigame.c" />
-    <ClCompile Include="util.c" />
-    <ClCompile Include="video.c" />
-    <ClCompile Include="yj1.c" />
-    <ClCompile Include="adplug\binfile.cpp" />
-    <ClCompile Include="adplug\binio.cpp" />
-    <ClCompile Include="adplug\dosbox_opl.cpp" />
-    <ClCompile Include="adplug\emuopl.cpp" />
-    <ClCompile Include="adplug\fmopl.c" />
-    <ClCompile Include="adplug\fprovide.cpp" />
-    <ClCompile Include="adplug\player.cpp" />
-    <ClCompile Include="adplug\rix.cpp" />
-    <ClCompile Include="adplug\surroundopl.cpp" />
-    <ClCompile Include="native_midi\native_midi_common.c" />
-    <ClCompile Include="native_midi\native_midi_win32.c" />
-    <ClCompile Include="libmad\bit.c" />
-    <ClCompile Include="libmad\decoder.c" />
-    <ClCompile Include="libmad\fixed.c" />
-    <ClCompile Include="libmad\frame.c" />
-    <ClCompile Include="libmad\huffman.c" />
-    <ClCompile Include="libmad\layer12.c" />
-    <ClCompile Include="libmad\layer3.c" />
-    <ClCompile Include="libmad\music_mad.c" />
-    <ClCompile Include="libmad\stream.c" />
-    <ClCompile Include="libmad\synth.c" />
-    <ClCompile Include="libmad\timer.c" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="adplug\adlibemu.h" />
-    <ClInclude Include="adplug\dbemuopl.h" />
-    <ClInclude Include="adplug\dbopl.h" />
-    <ClInclude Include="adplug\kemuopl.h" />
-    <ClInclude Include="ascii.h" />
-    <ClInclude Include="battle.h" />
-    <ClInclude Include="codepage.h" />
-    <ClInclude Include="common.h" />
-    <ClInclude Include="liboggvorbis\include\ogg\config_types.h" />
-    <ClInclude Include="ending.h" />
-    <ClInclude Include="fight.h" />
-    <ClInclude Include="font.h" />
-    <ClInclude Include="fontglyph.h" />
-    <ClInclude Include="game.h" />
-    <ClInclude Include="getopt.h" />
-    <ClInclude Include="global.h" />
-    <ClInclude Include="input.h" />
-    <ClInclude Include="itemmenu.h" />
-    <ClInclude Include="liboggvorbis\include\ogg\ogg.h" />
-    <ClInclude Include="liboggvorbis\include\ogg\os_types.h" />
-    <ClInclude Include="liboggvorbis\include\vorbis\codec.h" />
-    <ClInclude Include="liboggvorbis\include\vorbis\vorbisenc.h" />
-    <ClInclude Include="liboggvorbis\include\vorbis\vorbisfile.h" />
-    <ClInclude Include="liboggvorbis\src\backends.h" />
-    <ClInclude Include="liboggvorbis\src\bitrate.h" />
-    <ClInclude Include="liboggvorbis\src\books\coupled\res_books_51.h" />
-    <ClInclude Include="liboggvorbis\src\books\coupled\res_books_stereo.h" />
-    <ClInclude Include="liboggvorbis\src\books\floor\floor_books.h" />
-    <ClInclude Include="liboggvorbis\src\books\uncoupled\res_books_uncoupled.h" />
-    <ClInclude Include="liboggvorbis\src\codebook.h" />
-    <ClInclude Include="liboggvorbis\src\codec_internal.h" />
-    <ClInclude Include="liboggvorbis\src\envelope.h" />
-    <ClInclude Include="liboggvorbis\src\highlevel.h" />
-    <ClInclude Include="liboggvorbis\src\lookup.h" />
-    <ClInclude Include="liboggvorbis\src\lookup_data.h" />
-    <ClInclude Include="liboggvorbis\src\lpc.h" />
-    <ClInclude Include="liboggvorbis\src\lsp.h" />
-    <ClInclude Include="liboggvorbis\src\masking.h" />
-    <ClInclude Include="liboggvorbis\src\mdct.h" />
-    <ClInclude Include="liboggvorbis\src\misc.h" />
-    <ClInclude Include="liboggvorbis\src\modes\floor_all.h" />
-    <ClInclude Include="liboggvorbis\src\modes\psych_11.h" />
-    <ClInclude Include="liboggvorbis\src\modes\psych_16.h" />
-    <ClInclude Include="liboggvorbis\src\modes\psych_44.h" />
-    <ClInclude Include="liboggvorbis\src\modes\psych_8.h" />
-    <ClInclude Include="liboggvorbis\src\modes\residue_16.h" />
-    <ClInclude Include="liboggvorbis\src\modes\residue_44.h" />
-    <ClInclude Include="liboggvorbis\src\modes\residue_44p51.h" />
-    <ClInclude Include="liboggvorbis\src\modes\residue_44u.h" />
-    <ClInclude Include="liboggvorbis\src\modes\residue_8.h" />
-    <ClInclude Include="liboggvorbis\src\modes\setup_11.h" />
-    <ClInclude Include="liboggvorbis\src\modes\setup_16.h" />
-    <ClInclude Include="liboggvorbis\src\modes\setup_22.h" />
-    <ClInclude Include="liboggvorbis\src\modes\setup_32.h" />
-    <ClInclude Include="liboggvorbis\src\modes\setup_44.h" />
-    <ClInclude Include="liboggvorbis\src\modes\setup_44p51.h" />
-    <ClInclude Include="liboggvorbis\src\modes\setup_44u.h" />
-    <ClInclude Include="liboggvorbis\src\modes\setup_8.h" />
-    <ClInclude Include="liboggvorbis\src\modes\setup_X.h" />
-    <ClInclude Include="liboggvorbis\src\os.h" />
-    <ClInclude Include="liboggvorbis\src\psy.h" />
-    <ClInclude Include="liboggvorbis\src\registry.h" />
-    <ClInclude Include="liboggvorbis\src\scales.h" />
-    <ClInclude Include="liboggvorbis\src\smallft.h" />
-    <ClInclude Include="liboggvorbis\src\window.h" />
-    <ClInclude Include="magicmenu.h" />
-    <ClInclude Include="main.h" />
-    <ClInclude Include="map.h" />
-    <ClInclude Include="midi.h" />
-    <ClInclude Include="palcommon.h" />
-    <ClInclude Include="palette.h" />
-    <ClInclude Include="play.h" />
-    <ClInclude Include="res.h" />
-    <ClInclude Include="resampler.h" />
-    <ClInclude Include="players.h" />
-    <ClInclude Include="rngplay.h" />
-    <ClInclude Include="scene.h" />
-    <ClInclude Include="script.h" />
-    <ClInclude Include="sound.h" />
-    <ClInclude Include="text.h" />
-    <ClInclude Include="ui.h" />
-    <ClInclude Include="uibattle.h" />
-    <ClInclude Include="uigame.h" />
-    <ClInclude Include="util.h" />
-    <ClInclude Include="video.h" />
-    <ClInclude Include="adplug\binfile.h" />
-    <ClInclude Include="adplug\binio.h" />
-    <ClInclude Include="adplug\demuopl.h" />
-    <ClInclude Include="adplug\dosbox_opl.h" />
-    <ClInclude Include="adplug\emuopl.h" />
-    <ClInclude Include="adplug\fmopl.h" />
-    <ClInclude Include="adplug\fprovide.h" />
-    <ClInclude Include="adplug\opl.h" />
-    <ClInclude Include="adplug\player.h" />
-    <ClInclude Include="adplug\rix.h" />
-    <ClInclude Include="adplug\surroundopl.h" />
-    <ClInclude Include="native_midi\native_midi.h" />
-    <ClInclude Include="native_midi\native_midi_common.h" />
-    <ClInclude Include="libmad\bit.h" />
-    <ClInclude Include="libmad\decoder.h" />
-    <ClInclude Include="libmad\fixed.h" />
-    <ClInclude Include="libmad\frame.h" />
-    <ClInclude Include="libmad\huffman.h" />
-    <ClInclude Include="libmad\layer12.h" />
-    <ClInclude Include="libmad\layer3.h" />
-    <ClInclude Include="libmad\libmad_config.h" />
-    <ClInclude Include="libmad\libmad_global.h" />
-    <ClInclude Include="libmad\mad.h" />
-    <ClInclude Include="libmad\music_mad.h" />
-    <ClInclude Include="libmad\stream.h" />
-    <ClInclude Include="libmad\synth.h" />
-    <ClInclude Include="libmad\timer.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="sdlpal.cfg.example" />
-    <None Include="sdlpal.ico" />
-    <None Include="libmad\D.dat" />
-    <None Include="libmad\imdct_s.dat" />
-    <None Include="libmad\qc_table.dat" />
-    <None Include="libmad\rq_table.dat" />
-    <None Include="libmad\sf_table.dat" />
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="sdlpal.rc" />
-  </ItemGroup>
-  <ItemGroup>
-    <Text Include="AUTHORS.txt" />
-    <Text Include="README.txt" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>

+ 4 - 4
text.c

@@ -392,12 +392,11 @@ PAL_ReadMessageFile(
 				{
 					char *v;
 					int x, y, f, n, l, i = PAL_ParseLine(buffer, &v, &l, FALSE);
-					if (i >= 1 && i <= 80)
+					if (i >= 1 && i <= (sizeof(SCREENLAYOUT) / sizeof(PAL_POS)))
 					{
-						PAL_POS *poses = (PAL_POS *)&gConfig.ScreenLayout;
 						if ((n = sscanf(v, "%d,%d,%d", &x, &y, &f)) >= 2 && x < 320 && y < 200)
 						{
-							poses[i - 1] = PAL_XY(x, y);
+							gConfig.ScreenLayoutArray[i - 1] = PAL_XY(x, y);
 							if (n == 3) gConfig.ScreenLayoutFlag[i - 1] = f;
 						}
 					}
@@ -559,7 +558,7 @@ PAL_InitText(
 	   //
 	   // Read the words
 	   //
-	   temp = (LPBYTE)malloc(i);
+	   temp = (LPBYTE)malloc(gConfig.dwWordLength * g_TextLib.nWords);
 	   if (temp == NULL)
 	   {
 		   fclose(fpWord);
@@ -568,6 +567,7 @@ PAL_InitText(
 	   }
 	   fseek(fpWord, 0, SEEK_SET);
 	   fread(temp, i, 1, fpWord);
+	   memset(temp + i, 0, gConfig.dwWordLength * g_TextLib.nWords - i);
 
 	   //
 	   // Close the words file

+ 18 - 2
util.h

@@ -103,8 +103,6 @@ UTIL_CloseFile(
    FILE                *fp
 );
 
-#if defined(__WINPHONE__) || defined(__IOS__)
-
 LPCSTR
 UTIL_BasePath(
    VOID
@@ -121,8 +119,26 @@ UTIL_GetScreenSize(
    DWORD *pdwScreenHeight
 );
 
+#if PAL_HAS_TOUCH
+
+BOOL
+UTIL_TouchEnabled(
+   VOID
+);
+
 #endif
 
+INT
+UTIL_Platform_Init(
+   int argc,
+   char* argv[]
+);
+
+VOID
+UTIL_Platform_Quit(
+   VOID
+);
+
 #define _PATH_LOG           PAL_PREFIX "log.txt"
 #define LOG_EMERG           0 /* system is unusable */
 #define LOG_ALERT           1 /* action must be taken immediately */

+ 30 - 25
video.c

@@ -78,9 +78,6 @@ VIDEO_Startup(
 --*/
 {
 #if SDL_VERSION_ATLEAST(2,0,0)
-# if PAL_HAS_TOUCH
-   SDL_Surface *overlay;
-# endif
    //
    // Before we can render anything, we need a window and a renderer.
    //
@@ -92,7 +89,7 @@ VIDEO_Startup(
       return -1;
    }
 
-   gpRenderer = SDL_CreateRenderer(gpWindow, -1, SDL_RENDERER_ACCELERATED);
+   gpRenderer = SDL_CreateRenderer(gpWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
 
    if (gpRenderer == NULL)
    {
@@ -160,13 +157,19 @@ VIDEO_Startup(
    // Create texture for overlay.
    //
 #if PAL_HAS_TOUCH
-   overlay = SDL_LoadBMP(va("%s%s", PAL_PREFIX, "overlay.bmp"));
-   if (overlay != NULL)
+   if (gConfig.fUseTouchOverlay)
    {
-      SDL_SetColorKey(overlay, SDL_RLEACCEL, SDL_MapRGB(overlay->format, 255, 0, 255));
-      gpTouchOverlay = SDL_CreateTextureFromSurface(gpRenderer, overlay);
-      SDL_SetTextureAlphaMod(gpTouchOverlay, 120);
-      SDL_FreeSurface(overlay);
+      extern const void * PAL_LoadOverlayBMP(void);
+      extern int PAL_OverlayBMPLength();
+
+      SDL_Surface *overlay = SDL_LoadBMP_RW(SDL_RWFromConstMem(PAL_LoadOverlayBMP(), PAL_OverlayBMPLength()), 1);
+      if (overlay != NULL)
+      {
+         SDL_SetColorKey(overlay, SDL_RLEACCEL, SDL_MapRGB(overlay->format, 255, 0, 255));
+         gpTouchOverlay = SDL_CreateTextureFromSurface(gpRenderer, overlay);
+         SDL_SetTextureAlphaMod(gpTouchOverlay, 120);
+         SDL_FreeSurface(overlay);
+      }
    }
 #endif
 
@@ -404,11 +407,6 @@ VIDEO_UpdateScreen(
       dstrect.h = (WORD)((DWORD)(lpRect->h) * screenRealHeight / gpScreen->h);
 
       SDL_SoftStretch(gpScreen, (SDL_Rect *)lpRect, gpScreenReal, &dstrect);
-
-      if (SDL_MUSTLOCK(gpScreenReal))
-      {
-         SDL_UnlockSurface(gpScreenReal);
-      }
    }
    else if (g_wShakeTime != 0)
    {
@@ -449,11 +447,6 @@ VIDEO_UpdateScreen(
 
       SDL_FillRect(gpScreenReal, &dstrect, 0);
 
-      if (SDL_MUSTLOCK(gpScreenReal))
-      {
-         SDL_UnlockSurface(gpScreenReal);
-      }
-
 #if SDL_MAJOR_VERSION == 1 && SDL_MINOR_VERSION <= 2
       dstrect.x = dstrect.y = 0;
       dstrect.w = gpScreenReal->w;
@@ -470,11 +463,6 @@ VIDEO_UpdateScreen(
 
       SDL_SoftStretch(gpScreen, NULL, gpScreenReal, &dstrect);
 
-      if (SDL_MUSTLOCK(gpScreenReal))
-      {
-         SDL_UnlockSurface(gpScreenReal);
-      }
-
 #if SDL_MAJOR_VERSION == 1 && SDL_MINOR_VERSION <= 2
       dstrect.x = dstrect.y = 0;
       dstrect.w = gpScreenReal->w;
@@ -487,6 +475,11 @@ VIDEO_UpdateScreen(
 #else
    SDL_UpdateRect(gpScreenReal, dstrect.x, dstrect.y, dstrect.w, dstrect.h);
 #endif
+
+   if (SDL_MUSTLOCK(gpScreenReal))
+   {
+	   SDL_UnlockSurface(gpScreenReal);
+   }
 }
 
 VOID
@@ -928,12 +921,24 @@ VIDEO_SwitchScreen(
       dstrect.w = gpScreenReal->w;
       dstrect.h = screenRealHeight;
 
+	  if (SDL_MUSTLOCK(gpScreenReal))
+	  {
+		  if (SDL_LockSurface(gpScreenReal) < 0)
+			  return;
+	  }
+
       SDL_SoftStretch(gpScreenBak, NULL, gpScreenReal, &dstrect);
 #if SDL_VERSION_ATLEAST(2, 0, 0)
       VIDEO_RenderCopy();
 #else
       SDL_UpdateRect(gpScreenReal, 0, 0, gpScreenReal->w, gpScreenReal->h);
 #endif
+
+	  if (SDL_MUSTLOCK(gpScreenReal))
+	  {
+		  SDL_UnlockSurface(gpScreenReal);
+	  }
+
       UTIL_Delay(wSpeed);
    }
 }

+ 44 - 0
win32/resource.h

@@ -0,0 +1,44 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ 生成的包含文件。
+// 供 sdlpal.rc 使用
+//
+#define IDI_SDLPAL                      101
+#define IDD_LAUNCHER                    101
+#define IDD_LAUNCHER1                   102
+#define IDC_GAMEPATH                    1000
+#define IDC_DOS                         1002
+#define IDC_WIN95                       1003
+#define IDC_CHT                         1005
+#define IDC_CHS                         1006
+#define IDC_CUSTOM                      1007
+#define IDC_EMBEDFONT                   1009
+#define IDC_WIDTH                       1012
+#define IDC_HEIGHT                      1013
+#define IDC_ASPECTRATIO                 1014
+#define IDC_FULLSCREEN                  1015
+#define IDC_MSGFILE                     1017
+#define IDC_CD                          1019
+#define IDC_BGM                         1020
+#define IDC_OPL                         1021
+#define IDC_STEREO                      1022
+#define IDC_SAVE                        1023
+#define IDC_DEFAULT                     1024
+#define IDC_SURROUNDOPL                 1025
+#define IDC_SAMPLERATE                  1027
+#define IDC_OPLSR                       1028
+#define IDC_QUALITY                     1029
+#define IDC_VOLUME                      1030
+#define IDC_OPLOFFSET                   1031
+#define IDC_AUDIOBUFFER                 1032
+#define IDC_STATIC                      -1
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        104
+#define _APS_NEXT_COMMAND_VALUE         40001
+#define _APS_NEXT_CONTROL_VALUE         1030
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif

+ 476 - 0
win32/sdlpal.rc

@@ -0,0 +1,476 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "Windows.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// 非特定语言 resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU)
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+#pragma code_page(936)
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_LAUNCHER DIALOGEX 0, 0, 405, 211
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "SDL PAL Launcher"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+    DEFPUSHBUTTON   "&Launch game",IDOK,348,190,50,14
+    PUSHBUTTON      "E&xit",IDCANCEL,7,190,50,14
+    LTEXT           "Game resource path:",IDC_STATIC,14,10,68,8
+    EDITTEXT        IDC_GAMEPATH,84,7,314,14,ES_AUTOHSCROLL | ES_READONLY
+    LTEXT           "CD source:",IDC_STATIC,14,117,36,8
+    GROUPBOX        "Game version && Language",IDC_STATIC,7,31,192,64
+    CONTROL         "&DOS version",IDC_DOS,"Button",BS_AUTORADIOBUTTON | WS_GROUP,14,46,55,10
+    CONTROL         "&WIN95 version",IDC_WIN95,"Button",BS_AUTORADIOBUTTON,102,46,63,10
+    CONTROL         "&Traditional Chinese",IDC_CHT,"Button",BS_AUTORADIOBUTTON | WS_GROUP,14,62,77,10
+    CONTROL         "Simplified &Chinese",IDC_CHS,"Button",BS_AUTORADIOBUTTON,102,62,73,10
+    CONTROL         "C&ustomized",IDC_CUSTOM,"Button",BS_AUTORADIOBUTTON,14,78,48,10
+    CONTROL         "Use &embedded font",IDC_EMBEDFONT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,215,46,79,10
+    GROUPBOX        "Display",IDC_STATIC,206,31,192,64
+    LTEXT           "Window size:",IDC_STATIC,215,78,43,8
+    EDITTEXT        IDC_WIDTH,260,75,32,14,ES_AUTOHSCROLL | ES_NUMBER
+    CTEXT           "X",IDC_STATIC,295,78,8,8
+    EDITTEXT        IDC_HEIGHT,306,75,32,14,ES_AUTOHSCROLL | ES_NUMBER
+    CONTROL         "&Keep aspect ratio",IDC_ASPECTRATIO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,215,62,72,10
+    LTEXT           "BGM source:",IDC_STATIC,115,117,41,8
+    CONTROL         "&Full screen",IDC_FULLSCREEN,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_DISABLED | WS_TABSTOP,348,46,50,10
+    EDITTEXT        IDC_MSGFILE,72,75,118,14,ES_AUTOHSCROLL
+    GROUPBOX        "Audio",IDC_STATIC,7,102,391,78
+    COMBOBOX        IDC_CD,54,115,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_BGM,157,115,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    LTEXT           "OPL type:",IDC_STATIC,14,137,33,8
+    COMBOBOX        IDC_OPL,54,135,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "S&tereo",IDC_STEREO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,225,117,37,10
+    PUSHBUTTON      "S&ave",IDC_SAVE,118,190,50,14
+    PUSHBUTTON      "&Default",IDC_DEFAULT,239,190,50,14
+    CONTROL         "Surround &OPL parameter:                     Hz",IDC_SURROUNDOPL,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,250,137,148,10
+    LTEXT           "Audio sample rate:                      Hz",IDC_STATIC,280,117,113,8
+    EDITTEXT        IDC_SAMPLERATE,342,114,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    LTEXT           "OPL sample rate:                       Hz",IDC_STATIC,115,137,110,8
+    EDITTEXT        IDC_OPLSR,172,134,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    LTEXT           "Audio quality:",IDC_STATIC,14,157,45,8
+    LTEXT           "Low                                   High",IDC_STATIC,47,166,98,8
+    CONTROL         "",IDC_QUALITY,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,59,155,70,15
+    LTEXT           "Volume:",IDC_STATIC,145,157,26,8
+    CONTROL         "",IDC_VOLUME,"msctls_trackbar32",WS_TABSTOP,170,155,100,15
+    LTEXT           "Low                                              High",IDC_STATIC,163,166,120,8
+    LTEXT           "参数:                     Hz",IDC_STATIC,281,138,75,8
+    EDITTEXT        IDC_OPLOFFSET,343,134,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    LTEXT           "Audio buffer:",IDC_STATIC,299,157,44,8
+    EDITTEXT        IDC_AUDIOBUFFER,343,154,40,14,ES_AUTOHSCROLL | ES_NUMBER
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+    IDD_LAUNCHER, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 398
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 204
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// AFX_DIALOG_LAYOUT
+//
+
+IDD_LAUNCHER AFX_DIALOG_LAYOUT
+BEGIN
+    0
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog Info
+//
+
+IDD_LAUNCHER DLGINIT
+BEGIN
+    IDC_CD, 0x403, 4, 0
+0x504d, 0x0033, 
+    IDC_CD, 0x403, 4, 0
+0x474f, 0x0047, 
+    IDC_BGM, 0x403, 4, 0
+0x4952, 0x0058, 
+    IDC_BGM, 0x403, 5, 0
+0x494d, 0x4944, "\000" 
+    IDC_BGM, 0x403, 4, 0
+0x504d, 0x0033, 
+    IDC_BGM, 0x403, 4, 0
+0x474f, 0x0047, 
+    IDC_OPL, 0x403, 5, 0
+0x414d, 0x454d, "\000" 
+    IDC_OPL, 0x403, 7, 0
+0x4f44, 0x4253, 0x584f, "\000" 
+    0
+END
+
+#endif    // 非特定语言 resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// 中文(简体,中国) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
+LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
+#pragma code_page(936)
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_LAUNCHER DIALOGEX 0, 0, 405, 211
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "SDL PAL 启动器"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+    DEFPUSHBUTTON   "启动游戏(&L)",IDOK,348,190,50,14
+    PUSHBUTTON      "退出(&X)",IDCANCEL,7,190,50,14
+    LTEXT           "游戏资源目录:",IDC_STATIC,14,10,57,8
+    EDITTEXT        IDC_GAMEPATH,71,7,327,14,ES_AUTOHSCROLL | ES_READONLY
+    LTEXT           "CD 音源:",IDC_STATIC,14,117,36,8
+    GROUPBOX        "游戏资源版本及语言设置",IDC_STATIC,7,31,192,64
+    CONTROL         "&DOS 版",IDC_DOS,"Button",BS_AUTORADIOBUTTON | WS_GROUP,14,46,40,10
+    CONTROL         "&WIN95 版",IDC_WIN95,"Button",BS_AUTORADIOBUTTON,102,46,48,10
+    CONTROL         "繁体中文(&T)",IDC_CHT,"Button",BS_AUTORADIOBUTTON | WS_GROUP,14,62,57,10
+    CONTROL         "简体中文(&C)",IDC_CHS,"Button",BS_AUTORADIOBUTTON,102,62,58,10
+    CONTROL         "自定义(&U)",IDC_CUSTOM,"Button",BS_AUTORADIOBUTTON,14,78,48,10
+    CONTROL         "使用游戏内字体(&E)",IDC_EMBEDFONT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,215,46,81,10
+    GROUPBOX        "显示设置",IDC_STATIC,206,31,192,64
+    LTEXT           "窗口尺寸:",IDC_STATIC,215,78,41,8
+    EDITTEXT        IDC_WIDTH,260,75,32,14,ES_AUTOHSCROLL | ES_NUMBER
+    CTEXT           "X",IDC_STATIC,295,78,8,8
+    EDITTEXT        IDC_HEIGHT,306,75,32,14,ES_AUTOHSCROLL | ES_NUMBER
+    CONTROL         "保持纵横比(&K)",IDC_ASPECTRATIO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,215,62,65,10
+    LTEXT           "BGM 音源:",IDC_STATIC,115,117,41,8
+    CONTROL         "全屏启动游戏(&F)",IDC_FULLSCREEN,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_DISABLED | WS_TABSTOP,325,46,73,10
+    EDITTEXT        IDC_MSGFILE,72,75,118,14,ES_AUTOHSCROLL
+    GROUPBOX        "音频设置",IDC_STATIC,7,102,391,78
+    COMBOBOX        IDC_CD,54,115,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_BGM,157,115,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    LTEXT           "OPL 类型:",IDC_STATIC,14,137,40,8
+    COMBOBOX        IDC_OPL,54,135,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "立体声(&T)",IDC_STEREO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,225,116,49,10
+    PUSHBUTTON      "保存设置(&A)",IDC_SAVE,118,190,50,14
+    PUSHBUTTON      "默认设置(&D)",IDC_DEFAULT,239,190,50,14
+    CONTROL         "环绕声 &OPL",IDC_SURROUNDOPL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,225,137,55,10
+    LTEXT           "音频采样率:                      Hz",IDC_STATIC,285,117,101,8
+    EDITTEXT        IDC_SAMPLERATE,335,114,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    LTEXT           "OPL 采样率:                       Hz",IDC_STATIC,115,137,102,8
+    EDITTEXT        IDC_OPLSR,165,134,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    LTEXT           "音频质量:",IDC_STATIC,14,157,41,8
+    LTEXT           "低                                   高",IDC_STATIC,47,166,87,8
+    CONTROL         "",IDC_QUALITY,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,55,155,70,15
+    LTEXT           "音量:",IDC_STATIC,145,157,25,8
+    CONTROL         "",IDC_VOLUME,"msctls_trackbar32",WS_TABSTOP,170,155,100,15
+    LTEXT           "低                                                  高",IDC_STATIC,163,166,117,8
+    LTEXT           "参数:                     Hz",IDC_STATIC,285,137,75,8
+    EDITTEXT        IDC_OPLOFFSET,308,134,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    LTEXT           "音频缓冲区:",IDC_STATIC,291,157,49,8
+    EDITTEXT        IDC_AUDIOBUFFER,341,154,40,14,ES_AUTOHSCROLL | ES_NUMBER
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+    IDD_LAUNCHER, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 398
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 204
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// AFX_DIALOG_LAYOUT
+//
+
+IDD_LAUNCHER AFX_DIALOG_LAYOUT
+BEGIN
+    0
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog Info
+//
+
+IDD_LAUNCHER DLGINIT
+BEGIN
+    IDC_CD, 0x403, 4, 0
+0x504d, 0x0033, 
+    IDC_CD, 0x403, 4, 0
+0x474f, 0x0047, 
+    IDC_BGM, 0x403, 4, 0
+0x4952, 0x0058, 
+    IDC_BGM, 0x403, 5, 0
+0x494d, 0x4944, "\000" 
+    IDC_BGM, 0x403, 4, 0
+0x504d, 0x0033, 
+    IDC_BGM, 0x403, 4, 0
+0x474f, 0x0047, 
+    IDC_OPL, 0x403, 5, 0
+0x414d, 0x454d, "\000" 
+    IDC_OPL, 0x403, 7, 0
+0x4f44, 0x4253, 0x584f, "\000" 
+    0
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_SDLPAL              ICON                    "../sdlpal.ico"
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE 
+BEGIN
+    "#include ""Windows.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 2,0,0,1
+ PRODUCTVERSION 2,0,0,1
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "080404b0"
+        BEGIN
+            VALUE "CompanyName", "SDLPAL Team"
+            VALUE "FileDescription", "SDLPAL Main executable"
+            VALUE "FileVersion", "2.0.0.1"
+            VALUE "InternalName", "sdlpal.exe"
+            VALUE "LegalCopyright", "Copyright (C) SDLPAL Team 2008 - 2016"
+            VALUE "OriginalFilename", "sdlpal.exe"
+            VALUE "ProductName", "SDL PAL"
+            VALUE "ProductVersion", "2.0.0.1"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x804, 1200
+    END
+END
+
+#endif    // 中文(简体,中国) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// 中文(繁体,台湾) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHT)
+LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL
+#pragma code_page(950)
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_LAUNCHER DIALOGEX 0, 0, 405, 211
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "SDL PAL 币笆竟"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+    DEFPUSHBUTTON   "币笆笴栏(&L)",IDOK,348,190,50,14
+    PUSHBUTTON      "癶�(&X)",IDCANCEL,7,190,50,14
+    LTEXT           "笴栏戈方郎Ж�",IDC_STATIC,14,10,57,8
+    EDITTEXT        IDC_GAMEPATH,71,7,327,14,ES_AUTOHSCROLL | ES_READONLY
+    LTEXT           "CD �方�",IDC_STATIC,14,117,36,8
+    GROUPBOX        "笴栏戈方�セの粂ē砞﹚",IDC_STATIC,7,31,192,64
+    CONTROL         "&DOS �",IDC_DOS,"Button",BS_AUTORADIOBUTTON | WS_GROUP,14,46,40,10
+    CONTROL         "&WIN95 �",IDC_WIN95,"Button",BS_AUTORADIOBUTTON,102,46,48,10
+    CONTROL         "羉砰いゅ(&T)",IDC_CHT,"Button",BS_AUTORADIOBUTTON | WS_GROUP,14,62,57,10
+    CONTROL         "虏砰いゅ(&C)",IDC_CHS,"Button",BS_AUTORADIOBUTTON,102,62,58,10
+    CONTROL         "�﹚?(&U)",IDC_CUSTOM,"Button",BS_AUTORADIOBUTTON,14,78,48,10
+    CONTROL         "ㄏノ笴栏ず�砰(&E)",IDC_EMBEDFONT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,215,46,81,10
+    GROUPBOX        "陪ボ砞﹚",IDC_STATIC,206,31,192,64
+    LTEXT           "跌怠へ��",IDC_STATIC,215,78,41,8
+    EDITTEXT        IDC_WIDTH,260,75,32,14,ES_AUTOHSCROLL | ES_NUMBER
+    CTEXT           "X",IDC_STATIC,295,78,8,8
+    EDITTEXT        IDC_HEIGHT,306,75,32,14,ES_AUTOHSCROLL | ES_NUMBER
+    CONTROL         "玂�羇绢ゑ(&K)",IDC_ASPECTRATIO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,215,62,65,10
+    LTEXT           "BGM �方�",IDC_STATIC,115,117,41,8
+    CONTROL         "��币笆笴栏(&F)",IDC_FULLSCREEN,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_DISABLED | WS_TABSTOP,325,46,73,10
+    EDITTEXT        IDC_MSGFILE,72,75,118,14,ES_AUTOHSCROLL
+    GROUPBOX        "�癟砞﹚",IDC_STATIC,7,102,391,78
+    COMBOBOX        IDC_CD,54,115,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_BGM,157,115,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    LTEXT           "OPL 摸��",IDC_STATIC,14,137,40,8
+    COMBOBOX        IDC_OPL,54,135,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "ō菌羘(&T)",IDC_STEREO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,225,116,49,10
+    PUSHBUTTON      "玂�砞﹚(&A)",IDC_SAVE,118,190,50,14
+    PUSHBUTTON      "纐粄砞﹚(&D)",IDC_DEFAULT,239,190,50,14
+    CONTROL         "吏露羘 &OPL",IDC_SURROUNDOPL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,235,137,55,10
+    LTEXT           "�癟�妓硉瞯�                      Hz",IDC_STATIC,285,117,109,8
+    EDITTEXT        IDC_SAMPLERATE,342,114,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    LTEXT           "OPL �妓硉瞯�                       Hz",IDC_STATIC,115,137,110,8
+    EDITTEXT        IDC_OPLSR,172,134,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    LTEXT           "�癟珇借�",IDC_STATIC,14,157,41,8
+    LTEXT           "�                                   蔼",IDC_STATIC,47,166,87,8
+    CONTROL         "",IDC_QUALITY,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,55,155,70,15
+    LTEXT           "�秖�",IDC_STATIC,145,157,25,8
+    CONTROL         "",IDC_VOLUME,"msctls_trackbar32",WS_TABSTOP,170,155,100,15
+    LTEXT           "�                                                  蔼",IDC_STATIC,163,166,117,8
+    LTEXT           "把计�                     Hz",IDC_STATIC,297,137,75,8
+    EDITTEXT        IDC_OPLOFFSET,320,134,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    LTEXT           "�癟絯侥跋�",IDC_STATIC,291,157,49,8
+    EDITTEXT        IDC_AUDIOBUFFER,341,154,40,14,ES_AUTOHSCROLL | ES_NUMBER
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+    IDD_LAUNCHER, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 398
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 204
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// AFX_DIALOG_LAYOUT
+//
+
+IDD_LAUNCHER AFX_DIALOG_LAYOUT
+BEGIN
+    0
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog Info
+//
+
+IDD_LAUNCHER DLGINIT
+BEGIN
+    IDC_CD, 0x403, 4, 0
+0x504d, 0x0033, 
+    IDC_CD, 0x403, 4, 0
+0x474f, 0x0047, 
+    IDC_BGM, 0x403, 4, 0
+0x4952, 0x0058, 
+    IDC_BGM, 0x403, 5, 0
+0x494d, 0x4944, "\000" 
+    IDC_BGM, 0x403, 4, 0
+0x504d, 0x0033, 
+    IDC_BGM, 0x403, 4, 0
+0x474f, 0x0047, 
+    IDC_OPL, 0x403, 5, 0
+0x414d, 0x454d, "\000" 
+    IDC_OPL, 0x403, 7, 0
+0x4f44, 0x4253, 0x584f, "\000" 
+    0
+END
+
+#endif    // 中文(繁体,台湾) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+

+ 1 - 7
sdlpal.sln

@@ -1,24 +1,18 @@
 
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 14
-VisualStudioVersion = 14.0.23107.0
+VisualStudioVersion = 14.0.25123.0
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sdlpal", "sdlpal.vcxproj", "{837BDF47-9375-4C30-866B-07E262E94A01}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug_WIN95|Win32 = Debug_WIN95|Win32
 		Debug|Win32 = Debug|Win32
-		Release_WIN95|Win32 = Release_WIN95|Win32
 		Release|Win32 = Release|Win32
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{837BDF47-9375-4C30-866B-07E262E94A01}.Debug_WIN95|Win32.ActiveCfg = Debug|Win32
-		{837BDF47-9375-4C30-866B-07E262E94A01}.Debug_WIN95|Win32.Build.0 = Debug|Win32
 		{837BDF47-9375-4C30-866B-07E262E94A01}.Debug|Win32.ActiveCfg = Debug|Win32
 		{837BDF47-9375-4C30-866B-07E262E94A01}.Debug|Win32.Build.0 = Debug|Win32
-		{837BDF47-9375-4C30-866B-07E262E94A01}.Release_WIN95|Win32.ActiveCfg = Release|Win32
-		{837BDF47-9375-4C30-866B-07E262E94A01}.Release_WIN95|Win32.Build.0 = Release|Win32
 		{837BDF47-9375-4C30-866B-07E262E94A01}.Release|Win32.ActiveCfg = Release|Win32
 		{837BDF47-9375-4C30-866B-07E262E94A01}.Release|Win32.Build.0 = Release|Win32
 	EndGlobalSection

+ 344 - 0
win32/sdlpal.vcxproj

@@ -0,0 +1,344 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{837BDF47-9375-4C30-866B-07E262E94A01}</ProjectGuid>
+    <RootNamespace>sdlpal</RootNamespace>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseOfMfc>false</UseOfMfc>
+    <PlatformToolset>v120_xp</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseOfMfc>false</UseOfMfc>
+    <PlatformToolset>v120_xp</PlatformToolset>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup>
+    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <IncludePath>..\..\SDL2-2.0.3\include;$(IncludePath)</IncludePath>
+    <LibraryPath>..\..\SDL2-2.0.3\lib\x86;$(LibraryPath)</LibraryPath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <IncludePath>..\..\SDL2-2.0.3\include;$(IncludePath)</IncludePath>
+    <LibraryPath>..\..\SDL2-2.0.3\lib\x86;$(LibraryPath)</LibraryPath>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Midl>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <MkTypLibCompatible>true</MkTypLibCompatible>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <TargetEnvironment>Win32</TargetEnvironment>
+      <TypeLibraryName>.\Release/sdlpal_sdl2.tlb</TypeLibraryName>
+      <HeaderFileName>
+      </HeaderFileName>
+    </Midl>
+    <ClCompile>
+      <AdditionalIncludeDirectories>..\liboggvorbis\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>WIN32;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <StringPooling>true</StringPooling>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <WarningLevel>Level3</WarningLevel>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+    </ClCompile>
+    <ResourceCompile>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <Culture>0x0804</Culture>
+    </ResourceCompile>
+    <Link>
+      <AdditionalDependencies>winmm.lib;sdl2.lib;sdl2main.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <SubSystem>Windows</SubSystem>
+      <TargetMachine>MachineX86</TargetMachine>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+    <Bscmake />
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Midl>
+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <MkTypLibCompatible>true</MkTypLibCompatible>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <TargetEnvironment>Win32</TargetEnvironment>
+      <TypeLibraryName>.\Debug/sdlpal_sdl2.tlb</TypeLibraryName>
+      <HeaderFileName>
+      </HeaderFileName>
+    </Midl>
+    <ClCompile>
+      <AdditionalIncludeDirectories>..\liboggvorbis\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <MinimalRebuild>true</MinimalRebuild>
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+      <WarningLevel>Level3</WarningLevel>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+      <Optimization>Disabled</Optimization>
+    </ClCompile>
+    <ResourceCompile>
+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <Culture>0x0804</Culture>
+    </ResourceCompile>
+    <Link>
+      <AdditionalDependencies>winmm.lib;sdl2.lib;sdl2main.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Windows</SubSystem>
+      <TargetMachine>MachineX86</TargetMachine>
+    </Link>
+    <Bscmake />
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClCompile Include="..\adplug\adlibemu.c" />
+    <ClCompile Include="..\adplug\dbemuopl.cpp" />
+    <ClCompile Include="..\adplug\dbopl.cpp">
+      <InlineFunctionExpansion Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AnySuitable</InlineFunctionExpansion>
+      <IntrinsicFunctions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</IntrinsicFunctions>
+      <FavorSizeOrSpeed Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Speed</FavorSizeOrSpeed>
+      <OmitFramePointers Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</OmitFramePointers>
+    </ClCompile>
+    <ClCompile Include="..\adplug\demuopl.cpp" />
+    <ClCompile Include="..\battle.c" />
+    <ClCompile Include="..\ending.c" />
+    <ClCompile Include="..\fight.c" />
+    <ClCompile Include="..\font.c" />
+    <ClCompile Include="..\game.c" />
+    <ClCompile Include="..\getopt.c" />
+    <ClCompile Include="..\global.c" />
+    <ClCompile Include="..\input.c" />
+    <ClCompile Include="..\itemmenu.c" />
+    <ClCompile Include="..\liboggvorbis\src\analysis.c" />
+    <ClCompile Include="..\liboggvorbis\src\bitrate.c" />
+    <ClCompile Include="..\liboggvorbis\src\bitwise.c" />
+    <ClCompile Include="..\liboggvorbis\src\block.c" />
+    <ClCompile Include="..\liboggvorbis\src\codebook.c" />
+    <ClCompile Include="..\liboggvorbis\src\envelope.c" />
+    <ClCompile Include="..\liboggvorbis\src\floor0.c" />
+    <ClCompile Include="..\liboggvorbis\src\floor1.c" />
+    <ClCompile Include="..\liboggvorbis\src\framing.c" />
+    <ClCompile Include="..\liboggvorbis\src\info.c" />
+    <ClCompile Include="..\liboggvorbis\src\lookup.c" />
+    <ClCompile Include="..\liboggvorbis\src\lpc.c" />
+    <ClCompile Include="..\liboggvorbis\src\lsp.c" />
+    <ClCompile Include="..\liboggvorbis\src\mapping0.c" />
+    <ClCompile Include="..\liboggvorbis\src\mdct.c" />
+    <ClCompile Include="..\liboggvorbis\src\psy.c" />
+    <ClCompile Include="..\liboggvorbis\src\registry.c" />
+    <ClCompile Include="..\liboggvorbis\src\res0.c" />
+    <ClCompile Include="..\liboggvorbis\src\sharedbook.c" />
+    <ClCompile Include="..\liboggvorbis\src\smallft.c" />
+    <ClCompile Include="..\liboggvorbis\src\synthesis.c" />
+    <ClCompile Include="..\liboggvorbis\src\vorbisenc.c" />
+    <ClCompile Include="..\liboggvorbis\src\vorbisfile.c" />
+    <ClCompile Include="..\liboggvorbis\src\window.c" />
+    <ClCompile Include="..\magicmenu.c" />
+    <ClCompile Include="..\main.c" />
+    <ClCompile Include="..\map.c" />
+    <ClCompile Include="..\midi.c" />
+    <ClCompile Include="..\mp3play.c" />
+    <ClCompile Include="..\oggplay.c" />
+    <ClCompile Include="..\overlay.c" />
+    <ClCompile Include="..\palcommon.c" />
+    <ClCompile Include="..\palette.c" />
+    <ClCompile Include="..\play.c" />
+    <ClCompile Include="..\res.c" />
+    <ClCompile Include="..\resampler.c" />
+    <ClCompile Include="..\rixplay.cpp" />
+    <ClCompile Include="..\rngplay.c" />
+    <ClCompile Include="..\scene.c" />
+    <ClCompile Include="..\script.c" />
+    <ClCompile Include="..\sound.c" />
+    <ClCompile Include="..\text.c" />
+    <ClCompile Include="..\ui.c" />
+    <ClCompile Include="..\uibattle.c" />
+    <ClCompile Include="..\uigame.c" />
+    <ClCompile Include="..\util.c" />
+    <ClCompile Include="..\video.c" />
+    <ClCompile Include="..\yj1.c" />
+    <ClCompile Include="..\adplug\binfile.cpp" />
+    <ClCompile Include="..\adplug\binio.cpp" />
+    <ClCompile Include="..\adplug\dosbox_opl.cpp" />
+    <ClCompile Include="..\adplug\emuopl.cpp" />
+    <ClCompile Include="..\adplug\fmopl.c" />
+    <ClCompile Include="..\adplug\fprovide.cpp" />
+    <ClCompile Include="..\adplug\player.cpp" />
+    <ClCompile Include="..\adplug\rix.cpp" />
+    <ClCompile Include="..\adplug\surroundopl.cpp" />
+    <ClCompile Include="..\native_midi\native_midi_common.c" />
+    <ClCompile Include="..\native_midi\native_midi_win32.c" />
+    <ClCompile Include="..\libmad\bit.c" />
+    <ClCompile Include="..\libmad\decoder.c" />
+    <ClCompile Include="..\libmad\fixed.c" />
+    <ClCompile Include="..\libmad\frame.c" />
+    <ClCompile Include="..\libmad\huffman.c" />
+    <ClCompile Include="..\libmad\layer12.c" />
+    <ClCompile Include="..\libmad\layer3.c" />
+    <ClCompile Include="..\libmad\music_mad.c" />
+    <ClCompile Include="..\libmad\stream.c" />
+    <ClCompile Include="..\libmad\synth.c" />
+    <ClCompile Include="..\libmad\timer.c" />
+    <ClCompile Include="win32.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\adplug\adlibemu.h" />
+    <ClInclude Include="..\adplug\dbemuopl.h" />
+    <ClInclude Include="..\adplug\dbopl.h" />
+    <ClInclude Include="..\adplug\kemuopl.h" />
+    <ClInclude Include="..\ascii.h" />
+    <ClInclude Include="..\battle.h" />
+    <ClInclude Include="..\codepage.h" />
+    <ClInclude Include="..\common.h" />
+    <ClInclude Include="..\liboggvorbis\include\ogg\config_types.h" />
+    <ClInclude Include="..\ending.h" />
+    <ClInclude Include="..\fight.h" />
+    <ClInclude Include="..\font.h" />
+    <ClInclude Include="..\fontglyph.h" />
+    <ClInclude Include="..\game.h" />
+    <ClInclude Include="..\getopt.h" />
+    <ClInclude Include="..\global.h" />
+    <ClInclude Include="..\input.h" />
+    <ClInclude Include="..\itemmenu.h" />
+    <ClInclude Include="..\liboggvorbis\include\ogg\ogg.h" />
+    <ClInclude Include="..\liboggvorbis\include\ogg\os_types.h" />
+    <ClInclude Include="..\liboggvorbis\include\vorbis\codec.h" />
+    <ClInclude Include="..\liboggvorbis\include\vorbis\vorbisenc.h" />
+    <ClInclude Include="..\liboggvorbis\include\vorbis\vorbisfile.h" />
+    <ClInclude Include="..\liboggvorbis\src\backends.h" />
+    <ClInclude Include="..\liboggvorbis\src\bitrate.h" />
+    <ClInclude Include="..\liboggvorbis\src\books\coupled\res_books_51.h" />
+    <ClInclude Include="..\liboggvorbis\src\books\coupled\res_books_stereo.h" />
+    <ClInclude Include="..\liboggvorbis\src\books\floor\floor_books.h" />
+    <ClInclude Include="..\liboggvorbis\src\books\uncoupled\res_books_uncoupled.h" />
+    <ClInclude Include="..\liboggvorbis\src\codebook.h" />
+    <ClInclude Include="..\liboggvorbis\src\codec_internal.h" />
+    <ClInclude Include="..\liboggvorbis\src\envelope.h" />
+    <ClInclude Include="..\liboggvorbis\src\highlevel.h" />
+    <ClInclude Include="..\liboggvorbis\src\lookup.h" />
+    <ClInclude Include="..\liboggvorbis\src\lookup_data.h" />
+    <ClInclude Include="..\liboggvorbis\src\lpc.h" />
+    <ClInclude Include="..\liboggvorbis\src\lsp.h" />
+    <ClInclude Include="..\liboggvorbis\src\masking.h" />
+    <ClInclude Include="..\liboggvorbis\src\mdct.h" />
+    <ClInclude Include="..\liboggvorbis\src\misc.h" />
+    <ClInclude Include="..\liboggvorbis\src\modes\floor_all.h" />
+    <ClInclude Include="..\liboggvorbis\src\modes\psych_11.h" />
+    <ClInclude Include="..\liboggvorbis\src\modes\psych_16.h" />
+    <ClInclude Include="..\liboggvorbis\src\modes\psych_44.h" />
+    <ClInclude Include="..\liboggvorbis\src\modes\psych_8.h" />
+    <ClInclude Include="..\liboggvorbis\src\modes\residue_16.h" />
+    <ClInclude Include="..\liboggvorbis\src\modes\residue_44.h" />
+    <ClInclude Include="..\liboggvorbis\src\modes\residue_44p51.h" />
+    <ClInclude Include="..\liboggvorbis\src\modes\residue_44u.h" />
+    <ClInclude Include="..\liboggvorbis\src\modes\residue_8.h" />
+    <ClInclude Include="..\liboggvorbis\src\modes\setup_11.h" />
+    <ClInclude Include="..\liboggvorbis\src\modes\setup_16.h" />
+    <ClInclude Include="..\liboggvorbis\src\modes\setup_22.h" />
+    <ClInclude Include="..\liboggvorbis\src\modes\setup_32.h" />
+    <ClInclude Include="..\liboggvorbis\src\modes\setup_44.h" />
+    <ClInclude Include="..\liboggvorbis\src\modes\setup_44p51.h" />
+    <ClInclude Include="..\liboggvorbis\src\modes\setup_44u.h" />
+    <ClInclude Include="..\liboggvorbis\src\modes\setup_8.h" />
+    <ClInclude Include="..\liboggvorbis\src\modes\setup_X.h" />
+    <ClInclude Include="..\liboggvorbis\src\os.h" />
+    <ClInclude Include="..\liboggvorbis\src\psy.h" />
+    <ClInclude Include="..\liboggvorbis\src\registry.h" />
+    <ClInclude Include="..\liboggvorbis\src\scales.h" />
+    <ClInclude Include="..\liboggvorbis\src\smallft.h" />
+    <ClInclude Include="..\liboggvorbis\src\window.h" />
+    <ClInclude Include="..\magicmenu.h" />
+    <ClInclude Include="..\main.h" />
+    <ClInclude Include="..\map.h" />
+    <ClInclude Include="..\midi.h" />
+    <ClInclude Include="..\palcommon.h" />
+    <ClInclude Include="..\palette.h" />
+    <ClInclude Include="..\play.h" />
+    <ClInclude Include="..\res.h" />
+    <ClInclude Include="..\resampler.h" />
+    <ClInclude Include="..\players.h" />
+    <ClInclude Include="..\rngplay.h" />
+    <ClInclude Include="..\scene.h" />
+    <ClInclude Include="..\script.h" />
+    <ClInclude Include="..\sound.h" />
+    <ClInclude Include="..\text.h" />
+    <ClInclude Include="..\ui.h" />
+    <ClInclude Include="..\uibattle.h" />
+    <ClInclude Include="..\uigame.h" />
+    <ClInclude Include="..\util.h" />
+    <ClInclude Include="..\video.h" />
+    <ClInclude Include="..\adplug\binfile.h" />
+    <ClInclude Include="..\adplug\binio.h" />
+    <ClInclude Include="..\adplug\demuopl.h" />
+    <ClInclude Include="..\adplug\dosbox_opl.h" />
+    <ClInclude Include="..\adplug\emuopl.h" />
+    <ClInclude Include="..\adplug\fmopl.h" />
+    <ClInclude Include="..\adplug\fprovide.h" />
+    <ClInclude Include="..\adplug\opl.h" />
+    <ClInclude Include="..\adplug\player.h" />
+    <ClInclude Include="..\adplug\rix.h" />
+    <ClInclude Include="..\adplug\surroundopl.h" />
+    <ClInclude Include="..\native_midi\native_midi.h" />
+    <ClInclude Include="..\native_midi\native_midi_common.h" />
+    <ClInclude Include="..\libmad\bit.h" />
+    <ClInclude Include="..\libmad\decoder.h" />
+    <ClInclude Include="..\libmad\fixed.h" />
+    <ClInclude Include="..\libmad\frame.h" />
+    <ClInclude Include="..\libmad\huffman.h" />
+    <ClInclude Include="..\libmad\layer12.h" />
+    <ClInclude Include="..\libmad\layer3.h" />
+    <ClInclude Include="..\libmad\libmad_config.h" />
+    <ClInclude Include="..\libmad\libmad_global.h" />
+    <ClInclude Include="..\libmad\mad.h" />
+    <ClInclude Include="..\libmad\music_mad.h" />
+    <ClInclude Include="..\libmad\stream.h" />
+    <ClInclude Include="..\libmad\synth.h" />
+    <ClInclude Include="..\libmad\timer.h" />
+    <ClInclude Include="resource.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\sdlpal.cfg.example" />
+    <None Include="..\sdlpal.ico" />
+    <None Include="..\libmad\D.dat" />
+    <None Include="..\libmad\imdct_s.dat" />
+    <None Include="..\libmad\qc_table.dat" />
+    <None Include="..\libmad\rq_table.dat" />
+    <None Include="..\libmad\sf_table.dat" />
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="sdlpal.rc" />
+  </ItemGroup>
+  <ItemGroup>
+    <Text Include="..\AUTHORS.txt" />
+    <Text Include="..\README.txt" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>

+ 220 - 208
sdlpal.vcxproj.filters

@@ -51,627 +51,639 @@
     <Filter Include="liboggvorbis\include\vorbis">
       <UniqueIdentifier>{1da4fd33-6d94-4dbe-b0cd-2a9c9041df62}</UniqueIdentifier>
     </Filter>
+    <Filter Include="platform">
+      <UniqueIdentifier>{06f44698-1e02-440e-bc40-9858a46c2d8f}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="battle.c">
+    <ClCompile Include="..\battle.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="ending.c">
+    <ClCompile Include="..\ending.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="fight.c">
+    <ClCompile Include="..\fight.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="font.c">
+    <ClCompile Include="..\font.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="game.c">
+    <ClCompile Include="..\game.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="getopt.c">
+    <ClCompile Include="..\getopt.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="global.c">
+    <ClCompile Include="..\global.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="input.c">
+    <ClCompile Include="..\input.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="itemmenu.c">
+    <ClCompile Include="..\itemmenu.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="magicmenu.c">
+    <ClCompile Include="..\magicmenu.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="main.c">
+    <ClCompile Include="..\main.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="map.c">
+    <ClCompile Include="..\map.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="midi.c">
+    <ClCompile Include="..\midi.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="palcommon.c">
+    <ClCompile Include="..\palcommon.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="palette.c">
+    <ClCompile Include="..\palette.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="play.c">
+    <ClCompile Include="..\play.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="res.c">
+    <ClCompile Include="..\res.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="rixplay.cpp">
+    <ClCompile Include="..\rixplay.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="rngplay.c">
+    <ClCompile Include="..\rngplay.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="scene.c">
+    <ClCompile Include="..\scene.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="script.c">
+    <ClCompile Include="..\script.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="sound.c">
+    <ClCompile Include="..\sound.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="text.c">
+    <ClCompile Include="..\text.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="ui.c">
+    <ClCompile Include="..\ui.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="uibattle.c">
+    <ClCompile Include="..\uibattle.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="uigame.c">
+    <ClCompile Include="..\uigame.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="util.c">
+    <ClCompile Include="..\util.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="video.c">
+    <ClCompile Include="..\video.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="adplug\binfile.cpp">
+    <ClCompile Include="..\adplug\binfile.cpp">
       <Filter>adplug</Filter>
     </ClCompile>
-    <ClCompile Include="adplug\binio.cpp">
+    <ClCompile Include="..\adplug\binio.cpp">
       <Filter>adplug</Filter>
     </ClCompile>
-    <ClCompile Include="adplug\dosbox_opl.cpp">
+    <ClCompile Include="..\adplug\dosbox_opl.cpp">
       <Filter>adplug</Filter>
     </ClCompile>
-    <ClCompile Include="adplug\emuopl.cpp">
+    <ClCompile Include="..\adplug\emuopl.cpp">
       <Filter>adplug</Filter>
     </ClCompile>
-    <ClCompile Include="adplug\fmopl.c">
+    <ClCompile Include="..\adplug\fmopl.c">
       <Filter>adplug</Filter>
     </ClCompile>
-    <ClCompile Include="adplug\fprovide.cpp">
+    <ClCompile Include="..\adplug\fprovide.cpp">
       <Filter>adplug</Filter>
     </ClCompile>
-    <ClCompile Include="adplug\player.cpp">
+    <ClCompile Include="..\adplug\player.cpp">
       <Filter>adplug</Filter>
     </ClCompile>
-    <ClCompile Include="adplug\rix.cpp">
+    <ClCompile Include="..\adplug\rix.cpp">
       <Filter>adplug</Filter>
     </ClCompile>
-    <ClCompile Include="adplug\surroundopl.cpp">
+    <ClCompile Include="..\adplug\surroundopl.cpp">
       <Filter>adplug</Filter>
     </ClCompile>
-    <ClCompile Include="native_midi\native_midi_common.c">
+    <ClCompile Include="..\native_midi\native_midi_common.c">
       <Filter>native_midi</Filter>
     </ClCompile>
-    <ClCompile Include="native_midi\native_midi_win32.c">
+    <ClCompile Include="..\native_midi\native_midi_win32.c">
       <Filter>native_midi</Filter>
     </ClCompile>
-    <ClCompile Include="libmad\bit.c">
+    <ClCompile Include="..\libmad\bit.c">
       <Filter>libmad</Filter>
     </ClCompile>
-    <ClCompile Include="libmad\decoder.c">
+    <ClCompile Include="..\libmad\decoder.c">
       <Filter>libmad</Filter>
     </ClCompile>
-    <ClCompile Include="libmad\fixed.c">
+    <ClCompile Include="..\libmad\fixed.c">
       <Filter>libmad</Filter>
     </ClCompile>
-    <ClCompile Include="libmad\frame.c">
+    <ClCompile Include="..\libmad\frame.c">
       <Filter>libmad</Filter>
     </ClCompile>
-    <ClCompile Include="libmad\huffman.c">
+    <ClCompile Include="..\libmad\huffman.c">
       <Filter>libmad</Filter>
     </ClCompile>
-    <ClCompile Include="libmad\layer12.c">
+    <ClCompile Include="..\libmad\layer12.c">
       <Filter>libmad</Filter>
     </ClCompile>
-    <ClCompile Include="libmad\layer3.c">
+    <ClCompile Include="..\libmad\layer3.c">
       <Filter>libmad</Filter>
     </ClCompile>
-    <ClCompile Include="libmad\music_mad.c">
+    <ClCompile Include="..\libmad\music_mad.c">
       <Filter>libmad</Filter>
     </ClCompile>
-    <ClCompile Include="libmad\stream.c">
+    <ClCompile Include="..\libmad\stream.c">
       <Filter>libmad</Filter>
     </ClCompile>
-    <ClCompile Include="libmad\synth.c">
+    <ClCompile Include="..\libmad\synth.c">
       <Filter>libmad</Filter>
     </ClCompile>
-    <ClCompile Include="libmad\timer.c">
+    <ClCompile Include="..\libmad\timer.c">
       <Filter>libmad</Filter>
     </ClCompile>
-    <ClCompile Include="resampler.c">
+    <ClCompile Include="..\resampler.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="adplug\adlibemu.c">
+    <ClCompile Include="..\adplug\adlibemu.c">
       <Filter>adplug</Filter>
     </ClCompile>
-    <ClCompile Include="adplug\demuopl.cpp">
+    <ClCompile Include="..\adplug\demuopl.cpp">
       <Filter>adplug</Filter>
     </ClCompile>
-    <ClCompile Include="yj1.c">
+    <ClCompile Include="..\yj1.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\analysis.c">
+    <ClCompile Include="..\liboggvorbis\src\analysis.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\bitrate.c">
+    <ClCompile Include="..\liboggvorbis\src\bitrate.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\bitwise.c">
+    <ClCompile Include="..\liboggvorbis\src\bitwise.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\block.c">
+    <ClCompile Include="..\liboggvorbis\src\block.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\codebook.c">
+    <ClCompile Include="..\liboggvorbis\src\codebook.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\envelope.c">
+    <ClCompile Include="..\liboggvorbis\src\envelope.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\floor0.c">
+    <ClCompile Include="..\liboggvorbis\src\floor0.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\floor1.c">
+    <ClCompile Include="..\liboggvorbis\src\floor1.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\framing.c">
+    <ClCompile Include="..\liboggvorbis\src\framing.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\info.c">
+    <ClCompile Include="..\liboggvorbis\src\info.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\lookup.c">
+    <ClCompile Include="..\liboggvorbis\src\lookup.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\lpc.c">
+    <ClCompile Include="..\liboggvorbis\src\lpc.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\lsp.c">
+    <ClCompile Include="..\liboggvorbis\src\lsp.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\mapping0.c">
+    <ClCompile Include="..\liboggvorbis\src\mapping0.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\mdct.c">
+    <ClCompile Include="..\liboggvorbis\src\mdct.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\psy.c">
+    <ClCompile Include="..\liboggvorbis\src\psy.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\registry.c">
+    <ClCompile Include="..\liboggvorbis\src\registry.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\res0.c">
+    <ClCompile Include="..\liboggvorbis\src\res0.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\sharedbook.c">
+    <ClCompile Include="..\liboggvorbis\src\sharedbook.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\smallft.c">
+    <ClCompile Include="..\liboggvorbis\src\smallft.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\synthesis.c">
+    <ClCompile Include="..\liboggvorbis\src\synthesis.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\vorbisenc.c">
+    <ClCompile Include="..\liboggvorbis\src\vorbisenc.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\vorbisfile.c">
+    <ClCompile Include="..\liboggvorbis\src\vorbisfile.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="liboggvorbis\src\window.c">
+    <ClCompile Include="..\liboggvorbis\src\window.c">
       <Filter>liboggvorbis\src</Filter>
     </ClCompile>
-    <ClCompile Include="oggplay.c">
+    <ClCompile Include="..\oggplay.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="mp3play.c">
+    <ClCompile Include="..\mp3play.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="adplug\dbopl.cpp">
+    <ClCompile Include="..\adplug\dbopl.cpp">
       <Filter>adplug</Filter>
     </ClCompile>
-    <ClCompile Include="adplug\dbemuopl.cpp">
+    <ClCompile Include="..\adplug\dbemuopl.cpp">
       <Filter>adplug</Filter>
     </ClCompile>
+    <ClCompile Include="win32.cpp">
+      <Filter>platform</Filter>
+    </ClCompile>
+    <ClCompile Include="..\overlay.c">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
-    <ClInclude Include="ascii.h">
+    <ClInclude Include="..\ascii.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="battle.h">
+    <ClInclude Include="..\battle.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="common.h">
+    <ClInclude Include="..\common.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="ending.h">
+    <ClInclude Include="..\ending.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="fight.h">
+    <ClInclude Include="..\fight.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="font.h">
+    <ClInclude Include="..\font.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="game.h">
+    <ClInclude Include="..\game.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="getopt.h">
+    <ClInclude Include="..\getopt.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="global.h">
+    <ClInclude Include="..\global.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="input.h">
+    <ClInclude Include="..\input.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="itemmenu.h">
+    <ClInclude Include="..\itemmenu.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="magicmenu.h">
+    <ClInclude Include="..\magicmenu.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="main.h">
+    <ClInclude Include="..\main.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="map.h">
+    <ClInclude Include="..\map.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="midi.h">
+    <ClInclude Include="..\midi.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="palcommon.h">
+    <ClInclude Include="..\palcommon.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="palette.h">
+    <ClInclude Include="..\palette.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="play.h">
+    <ClInclude Include="..\play.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="res.h">
+    <ClInclude Include="..\res.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="rngplay.h">
+    <ClInclude Include="..\rngplay.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="scene.h">
+    <ClInclude Include="..\scene.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="script.h">
+    <ClInclude Include="..\script.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="sound.h">
+    <ClInclude Include="..\sound.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="text.h">
+    <ClInclude Include="..\text.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="ui.h">
+    <ClInclude Include="..\ui.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="uibattle.h">
+    <ClInclude Include="..\uibattle.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="uigame.h">
+    <ClInclude Include="..\uigame.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="util.h">
+    <ClInclude Include="..\util.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="video.h">
+    <ClInclude Include="..\video.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="adplug\binfile.h">
+    <ClInclude Include="..\adplug\binfile.h">
       <Filter>adplug</Filter>
     </ClInclude>
-    <ClInclude Include="adplug\binio.h">
+    <ClInclude Include="..\adplug\binio.h">
       <Filter>adplug</Filter>
     </ClInclude>
-    <ClInclude Include="adplug\demuopl.h">
+    <ClInclude Include="..\adplug\demuopl.h">
       <Filter>adplug</Filter>
     </ClInclude>
-    <ClInclude Include="adplug\dosbox_opl.h">
+    <ClInclude Include="..\adplug\dosbox_opl.h">
       <Filter>adplug</Filter>
     </ClInclude>
-    <ClInclude Include="adplug\emuopl.h">
+    <ClInclude Include="..\adplug\emuopl.h">
       <Filter>adplug</Filter>
     </ClInclude>
-    <ClInclude Include="adplug\fmopl.h">
+    <ClInclude Include="..\adplug\fmopl.h">
       <Filter>adplug</Filter>
     </ClInclude>
-    <ClInclude Include="adplug\fprovide.h">
+    <ClInclude Include="..\adplug\fprovide.h">
       <Filter>adplug</Filter>
     </ClInclude>
-    <ClInclude Include="adplug\opl.h">
+    <ClInclude Include="..\adplug\opl.h">
       <Filter>adplug</Filter>
     </ClInclude>
-    <ClInclude Include="adplug\player.h">
+    <ClInclude Include="..\adplug\player.h">
       <Filter>adplug</Filter>
     </ClInclude>
-    <ClInclude Include="adplug\rix.h">
+    <ClInclude Include="..\adplug\rix.h">
       <Filter>adplug</Filter>
     </ClInclude>
-    <ClInclude Include="adplug\surroundopl.h">
+    <ClInclude Include="..\adplug\surroundopl.h">
       <Filter>adplug</Filter>
     </ClInclude>
-    <ClInclude Include="native_midi\native_midi.h">
+    <ClInclude Include="..\native_midi\native_midi.h">
       <Filter>native_midi</Filter>
     </ClInclude>
-    <ClInclude Include="native_midi\native_midi_common.h">
+    <ClInclude Include="..\native_midi\native_midi_common.h">
       <Filter>native_midi</Filter>
     </ClInclude>
-    <ClInclude Include="libmad\bit.h">
+    <ClInclude Include="..\libmad\bit.h">
       <Filter>libmad</Filter>
     </ClInclude>
-    <ClInclude Include="libmad\decoder.h">
+    <ClInclude Include="..\libmad\decoder.h">
       <Filter>libmad</Filter>
     </ClInclude>
-    <ClInclude Include="libmad\fixed.h">
+    <ClInclude Include="..\libmad\fixed.h">
       <Filter>libmad</Filter>
     </ClInclude>
-    <ClInclude Include="libmad\frame.h">
+    <ClInclude Include="..\libmad\frame.h">
       <Filter>libmad</Filter>
     </ClInclude>
-    <ClInclude Include="libmad\huffman.h">
+    <ClInclude Include="..\libmad\huffman.h">
       <Filter>libmad</Filter>
     </ClInclude>
-    <ClInclude Include="libmad\layer12.h">
+    <ClInclude Include="..\libmad\layer12.h">
       <Filter>libmad</Filter>
     </ClInclude>
-    <ClInclude Include="libmad\layer3.h">
+    <ClInclude Include="..\libmad\layer3.h">
       <Filter>libmad</Filter>
     </ClInclude>
-    <ClInclude Include="libmad\libmad_config.h">
+    <ClInclude Include="..\libmad\libmad_config.h">
       <Filter>libmad</Filter>
     </ClInclude>
-    <ClInclude Include="libmad\libmad_global.h">
+    <ClInclude Include="..\libmad\libmad_global.h">
       <Filter>libmad</Filter>
     </ClInclude>
-    <ClInclude Include="libmad\mad.h">
+    <ClInclude Include="..\libmad\mad.h">
       <Filter>libmad</Filter>
     </ClInclude>
-    <ClInclude Include="libmad\music_mad.h">
+    <ClInclude Include="..\libmad\music_mad.h">
       <Filter>libmad</Filter>
     </ClInclude>
-    <ClInclude Include="libmad\stream.h">
+    <ClInclude Include="..\libmad\stream.h">
       <Filter>libmad</Filter>
     </ClInclude>
-    <ClInclude Include="libmad\synth.h">
+    <ClInclude Include="..\libmad\synth.h">
       <Filter>libmad</Filter>
     </ClInclude>
-    <ClInclude Include="libmad\timer.h">
+    <ClInclude Include="..\libmad\timer.h">
       <Filter>libmad</Filter>
     </ClInclude>
-    <ClInclude Include="codepage.h">
+    <ClInclude Include="..\codepage.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="fontglyph.h">
+    <ClInclude Include="..\fontglyph.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="resampler.h">
+    <ClInclude Include="..\resampler.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="adplug\adlibemu.h">
+    <ClInclude Include="..\adplug\adlibemu.h">
       <Filter>adplug</Filter>
     </ClInclude>
-    <ClInclude Include="adplug\kemuopl.h">
+    <ClInclude Include="..\adplug\kemuopl.h">
       <Filter>adplug</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\modes\floor_all.h">
+    <ClInclude Include="..\liboggvorbis\src\modes\floor_all.h">
       <Filter>liboggvorbis\src\modes</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\modes\psych_8.h">
+    <ClInclude Include="..\liboggvorbis\src\modes\psych_8.h">
       <Filter>liboggvorbis\src\modes</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\modes\psych_11.h">
+    <ClInclude Include="..\liboggvorbis\src\modes\psych_11.h">
       <Filter>liboggvorbis\src\modes</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\modes\psych_16.h">
+    <ClInclude Include="..\liboggvorbis\src\modes\psych_16.h">
       <Filter>liboggvorbis\src\modes</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\modes\psych_44.h">
+    <ClInclude Include="..\liboggvorbis\src\modes\psych_44.h">
       <Filter>liboggvorbis\src\modes</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\modes\residue_8.h">
+    <ClInclude Include="..\liboggvorbis\src\modes\residue_8.h">
       <Filter>liboggvorbis\src\modes</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\modes\residue_16.h">
+    <ClInclude Include="..\liboggvorbis\src\modes\residue_16.h">
       <Filter>liboggvorbis\src\modes</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\modes\residue_44.h">
+    <ClInclude Include="..\liboggvorbis\src\modes\residue_44.h">
       <Filter>liboggvorbis\src\modes</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\modes\residue_44p51.h">
+    <ClInclude Include="..\liboggvorbis\src\modes\residue_44p51.h">
       <Filter>liboggvorbis\src\modes</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\modes\residue_44u.h">
+    <ClInclude Include="..\liboggvorbis\src\modes\residue_44u.h">
       <Filter>liboggvorbis\src\modes</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\modes\setup_8.h">
+    <ClInclude Include="..\liboggvorbis\src\modes\setup_8.h">
       <Filter>liboggvorbis\src\modes</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\modes\setup_11.h">
+    <ClInclude Include="..\liboggvorbis\src\modes\setup_11.h">
       <Filter>liboggvorbis\src\modes</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\modes\setup_16.h">
+    <ClInclude Include="..\liboggvorbis\src\modes\setup_16.h">
       <Filter>liboggvorbis\src\modes</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\modes\setup_22.h">
+    <ClInclude Include="..\liboggvorbis\src\modes\setup_22.h">
       <Filter>liboggvorbis\src\modes</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\modes\setup_32.h">
+    <ClInclude Include="..\liboggvorbis\src\modes\setup_32.h">
       <Filter>liboggvorbis\src\modes</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\modes\setup_44.h">
+    <ClInclude Include="..\liboggvorbis\src\modes\setup_44.h">
       <Filter>liboggvorbis\src\modes</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\modes\setup_44p51.h">
+    <ClInclude Include="..\liboggvorbis\src\modes\setup_44p51.h">
       <Filter>liboggvorbis\src\modes</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\modes\setup_44u.h">
+    <ClInclude Include="..\liboggvorbis\src\modes\setup_44u.h">
       <Filter>liboggvorbis\src\modes</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\modes\setup_X.h">
+    <ClInclude Include="..\liboggvorbis\src\modes\setup_X.h">
       <Filter>liboggvorbis\src\modes</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\books\coupled\res_books_51.h">
+    <ClInclude Include="..\liboggvorbis\src\books\coupled\res_books_51.h">
       <Filter>liboggvorbis\src\books\coupled</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\books\coupled\res_books_stereo.h">
+    <ClInclude Include="..\liboggvorbis\src\books\coupled\res_books_stereo.h">
       <Filter>liboggvorbis\src\books\coupled</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\books\floor\floor_books.h">
+    <ClInclude Include="..\liboggvorbis\src\books\floor\floor_books.h">
       <Filter>liboggvorbis\src\books\floor</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\books\uncoupled\res_books_uncoupled.h">
+    <ClInclude Include="..\liboggvorbis\src\books\uncoupled\res_books_uncoupled.h">
       <Filter>liboggvorbis\src\books\uncoupled</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\backends.h">
+    <ClInclude Include="..\liboggvorbis\src\backends.h">
       <Filter>liboggvorbis\src</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\bitrate.h">
+    <ClInclude Include="..\liboggvorbis\src\bitrate.h">
       <Filter>liboggvorbis\src</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\codebook.h">
+    <ClInclude Include="..\liboggvorbis\src\codebook.h">
       <Filter>liboggvorbis\src</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\codec_internal.h">
+    <ClInclude Include="..\liboggvorbis\src\codec_internal.h">
       <Filter>liboggvorbis\src</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\envelope.h">
+    <ClInclude Include="..\liboggvorbis\src\envelope.h">
       <Filter>liboggvorbis\src</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\highlevel.h">
+    <ClInclude Include="..\liboggvorbis\src\highlevel.h">
       <Filter>liboggvorbis\src</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\lookup.h">
+    <ClInclude Include="..\liboggvorbis\src\lookup.h">
       <Filter>liboggvorbis\src</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\lookup_data.h">
+    <ClInclude Include="..\liboggvorbis\src\lookup_data.h">
       <Filter>liboggvorbis\src</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\lpc.h">
+    <ClInclude Include="..\liboggvorbis\src\lpc.h">
       <Filter>liboggvorbis\src</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\lsp.h">
+    <ClInclude Include="..\liboggvorbis\src\lsp.h">
       <Filter>liboggvorbis\src</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\masking.h">
+    <ClInclude Include="..\liboggvorbis\src\masking.h">
       <Filter>liboggvorbis\src</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\mdct.h">
+    <ClInclude Include="..\liboggvorbis\src\mdct.h">
       <Filter>liboggvorbis\src</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\misc.h">
+    <ClInclude Include="..\liboggvorbis\src\misc.h">
       <Filter>liboggvorbis\src</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\os.h">
+    <ClInclude Include="..\liboggvorbis\src\os.h">
       <Filter>liboggvorbis\src</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\psy.h">
+    <ClInclude Include="..\liboggvorbis\src\psy.h">
       <Filter>liboggvorbis\src</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\registry.h">
+    <ClInclude Include="..\liboggvorbis\src\registry.h">
       <Filter>liboggvorbis\src</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\scales.h">
+    <ClInclude Include="..\liboggvorbis\src\scales.h">
       <Filter>liboggvorbis\src</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\smallft.h">
+    <ClInclude Include="..\liboggvorbis\src\smallft.h">
       <Filter>liboggvorbis\src</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\src\window.h">
+    <ClInclude Include="..\liboggvorbis\src\window.h">
       <Filter>liboggvorbis\src</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\include\vorbis\codec.h">
+    <ClInclude Include="..\liboggvorbis\include\vorbis\codec.h">
       <Filter>liboggvorbis\include\vorbis</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\include\vorbis\vorbisenc.h">
+    <ClInclude Include="..\liboggvorbis\include\vorbis\vorbisenc.h">
       <Filter>liboggvorbis\include\vorbis</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\include\vorbis\vorbisfile.h">
+    <ClInclude Include="..\liboggvorbis\include\vorbis\vorbisfile.h">
       <Filter>liboggvorbis\include\vorbis</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\include\ogg\ogg.h">
+    <ClInclude Include="..\liboggvorbis\include\ogg\ogg.h">
       <Filter>liboggvorbis\include\ogg</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\include\ogg\os_types.h">
+    <ClInclude Include="..\liboggvorbis\include\ogg\os_types.h">
       <Filter>liboggvorbis\include\ogg</Filter>
     </ClInclude>
-    <ClInclude Include="players.h">
+    <ClInclude Include="..\players.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="adplug\dbopl.h">
+    <ClInclude Include="..\adplug\dbopl.h">
       <Filter>adplug</Filter>
     </ClInclude>
-    <ClInclude Include="adplug\dbemuopl.h">
+    <ClInclude Include="..\adplug\dbemuopl.h">
       <Filter>adplug</Filter>
     </ClInclude>
-    <ClInclude Include="liboggvorbis\include\ogg\config_types.h">
+    <ClInclude Include="..\liboggvorbis\include\ogg\config_types.h">
       <Filter>liboggvorbis\include\ogg</Filter>
     </ClInclude>
+    <ClInclude Include="resource.h">
+      <Filter>platform</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
-    <None Include="sdlpal.ico">
+    <None Include="..\sdlpal.ico">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="libmad\D.dat">
+    <None Include="..\libmad\D.dat">
       <Filter>libmad</Filter>
     </None>
-    <None Include="libmad\imdct_s.dat">
+    <None Include="..\libmad\imdct_s.dat">
       <Filter>libmad</Filter>
     </None>
-    <None Include="libmad\qc_table.dat">
+    <None Include="..\libmad\qc_table.dat">
       <Filter>libmad</Filter>
     </None>
-    <None Include="libmad\rq_table.dat">
+    <None Include="..\libmad\rq_table.dat">
       <Filter>libmad</Filter>
     </None>
-    <None Include="libmad\sf_table.dat">
+    <None Include="..\libmad\sf_table.dat">
       <Filter>libmad</Filter>
     </None>
-    <None Include="sdlpal.cfg.example">
+    <None Include="..\sdlpal.cfg.example">
       <Filter>Resource Files</Filter>
     </None>
   </ItemGroup>
   <ItemGroup>
-    <ResourceCompile Include="sdlpal.rc">
-      <Filter>Resource Files</Filter>
-    </ResourceCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <Text Include="AUTHORS.txt">
+    <Text Include="..\AUTHORS.txt">
       <Filter>Resource Files</Filter>
     </Text>
-    <Text Include="README.txt">
+    <Text Include="..\README.txt">
       <Filter>Resource Files</Filter>
     </Text>
   </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="sdlpal.rc">
+      <Filter>Resource Files</Filter>
+    </ResourceCompile>
+  </ItemGroup>
 </Project>

+ 294 - 0
win32/win32.cpp

@@ -0,0 +1,294 @@
+#define UNICODE
+#define _UNICODE
+#define _CRT_SECURE_NO_WARNINGS
+
+#include <tchar.h>
+#include <Windows.h>
+#include <CommCtrl.h>
+#include <string>
+#include "resource.h"
+#include "../global.h"
+#include "../util.h"
+
+#pragma comment(lib, "comctl32.lib")
+#pragma comment(linker,"\"/manifestdependency:type='win32' \
+name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
+processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
+
+#define ComboBox_AddString(hwndDlg, idCtrl, lpsz) \
+            (BOOL)SNDMSG(GetDlgItem((hwndDlg), (idCtrl)), CB_ADDSTRING, (WPARAM)(0), (LPARAM)(lpsz))
+#define ComboBox_SetCurSel(hwndDlg, idCtrl, index) \
+            (BOOL)SNDMSG(GetDlgItem((hwndDlg), (idCtrl)), CB_SETCURSEL, (WPARAM)(index), (LPARAM)(0))
+#define ComboBox_GetCurSel(hwndDlg, idCtrl) \
+            (int)SNDMSG(GetDlgItem((hwndDlg), (idCtrl)), CB_GETCURSEL, (WPARAM)(0), (LPARAM)(0))
+#define TrackBar_SetRange(hwndDlg, idCtrl, min, max, redraw) \
+            (BOOL)SNDMSG(GetDlgItem((hwndDlg), (idCtrl)), TBM_SETRANGE, (WPARAM)(redraw), (LPARAM)(MAKELONG((min), (max))))
+#define TrackBar_SetPos(hwndDlg, idCtrl, pos, redraw) \
+            (BOOL)SNDMSG(GetDlgItem((hwndDlg), (idCtrl)), TBM_SETPOS, (WPARAM)(redraw), (LPARAM)(pos))
+#define TrackBar_GetPos(hwndDlg, idCtrl) \
+            (int)SNDMSG(GetDlgItem((hwndDlg), (idCtrl)), TBM_GETPOS, (WPARAM)(0), (LPARAM)(0))
+#define EnableDlgItem(hwnd, nIDControl, bEnable) \
+			EnableWindow(GetDlgItem((hwnd), (nIDControl)), (bEnable))
+
+void SaveSettings(HWND hwndDlg, BOOL fWriteFile)
+{
+	if (fWriteFile)
+	{
+		std::string msgfile;
+		char buffer[40];
+		int len = GetWindowTextLengthA(GetDlgItem(hwndDlg, IDC_MSGFILE)) + 1;
+		msgfile.assign(len, ' ');
+		GetDlgItemTextA(hwndDlg, IDC_MSGFILE, (char*)msgfile.data(), len);
+
+		FILE *fp = UTIL_OpenFileForMode("sdlpal.cfg", "w");
+		fprintf(fp, "DOS=%d\n", IsDlgButtonChecked(hwndDlg, IDC_DOS));
+		if (IsDlgButtonChecked(hwndDlg, IDC_DOS))
+			fprintf(fp, "UseEmbeddedFonts=%d\n", IsDlgButtonChecked(hwndDlg, IDC_EMBEDFONT));
+		else if (!IsDlgButtonChecked(hwndDlg, IDC_CUSTOM))
+			fprintf(fp, "CodePage=%d\n", IsDlgButtonChecked(hwndDlg, IDC_CHS));
+		if (IsDlgButtonChecked(hwndDlg, IDC_CUSTOM))
+			fprintf(fp, "MessageFileName=%s\n", msgfile.c_str());
+		GetDlgItemTextA(hwndDlg, IDC_CD, buffer, 40); fprintf(fp, "CD=%s\n", buffer);
+		GetDlgItemTextA(hwndDlg, IDC_BGM, buffer, 40); fprintf(fp, "MUSIC=%s\n", buffer);
+		if (ComboBox_GetCurSel(hwndDlg, IDC_BGM) == MUSIC_RIX)
+		{
+			GetDlgItemTextA(hwndDlg, IDC_OPL, buffer, 40); fprintf(fp, "OPL=%s\n", buffer);
+			fprintf(fp, "UseSurroundOPL=%d\n", IsDlgButtonChecked(hwndDlg, IDC_SURROUNDOPL));
+			fprintf(fp, "OPLSampleRate=%u\n", GetDlgItemInt(hwndDlg, IDC_OPLSR, nullptr, FALSE));
+			fprintf(fp, "SurroundOPLOffset=%d\n", GetDlgItemInt(hwndDlg, IDC_OPLOFFSET, nullptr, TRUE));
+		}
+		fprintf(fp, "Stereo=%d\n", IsDlgButtonChecked(hwndDlg, IDC_STEREO));
+		fprintf(fp, "ResampleQuality=%d\n", TrackBar_GetPos(hwndDlg, IDC_QUALITY));
+		fprintf(fp, "Volume=%d\n", TrackBar_GetPos(hwndDlg, IDC_VOLUME));
+		fprintf(fp, "AudioBufferSize=%u\n", GetDlgItemInt(hwndDlg, IDC_AUDIOBUFFER, nullptr, FALSE));
+		fprintf(fp, "SampleRate=%u\n", GetDlgItemInt(hwndDlg, IDC_SAMPLERATE, nullptr, FALSE));
+		fprintf(fp, "WindowWidth=%u\n", GetDlgItemInt(hwndDlg, IDC_WIDTH, nullptr, FALSE));
+		fprintf(fp, "WindowHeight=%u\n", GetDlgItemInt(hwndDlg, IDC_HEIGHT, nullptr, FALSE));
+		fprintf(fp, "KeepAspectRatio=%d\n", IsDlgButtonChecked(hwndDlg, IDC_ASPECTRATIO));
+		fclose(fp);
+	}
+	else
+	{
+		PAL_LoadConfig(FALSE);
+
+		gConfig.fIsWIN95 = !IsDlgButtonChecked(hwndDlg, IDC_DOS);
+		gConfig.fUseEmbeddedFonts = !gConfig.fIsWIN95 && IsDlgButtonChecked(hwndDlg, IDC_EMBEDFONT);
+		if (!IsDlgButtonChecked(hwndDlg, IDC_CUSTOM))
+		{
+			if (IsDlgButtonChecked(hwndDlg, IDC_CHS) && gConfig.fIsWIN95)
+				gConfig.iCodePage = CP_GBK;
+			else
+				gConfig.iCodePage = CP_BIG5;
+			free(gConfig.pszMsgName);
+			gConfig.pszMsgName = nullptr;
+		}
+		else
+		{
+			int length = GetWindowTextLengthA(GetDlgItem(hwndDlg, IDC_MSGFILE));
+			gConfig.pszMsgName = (char*)realloc(gConfig.pszMsgName, length + 1);
+			GetDlgItemTextA(hwndDlg, IDC_MSGFILE, gConfig.pszMsgName, length + 1);
+		}
+		gConfig.fKeepAspectRatio = IsDlgButtonChecked(hwndDlg, IDC_ASPECTRATIO);
+		gConfig.dwScreenWidth = GetDlgItemInt(hwndDlg, IDC_WIDTH, nullptr, FALSE);
+		gConfig.dwScreenHeight = GetDlgItemInt(hwndDlg, IDC_HEIGHT, nullptr, FALSE);
+		gConfig.eCDType = (MUSICTYPE)(ComboBox_GetCurSel(hwndDlg, IDC_CD) + MUSIC_MP3);
+		gConfig.eMusicType = (MUSICTYPE)ComboBox_GetCurSel(hwndDlg, IDC_BGM);
+		gConfig.eOPLType = (OPLTYPE)(ComboBox_GetCurSel(hwndDlg, IDC_OPL) + OPL_DOSBOX_OLD);
+		gConfig.iAudioChannels = IsDlgButtonChecked(hwndDlg, IDC_STEREO) ? 2 : 1;
+		gConfig.iSampleRate = GetDlgItemInt(hwndDlg, IDC_SAMPLERATE, nullptr, FALSE);
+		gConfig.wAudioBufferSize = GetDlgItemInt(hwndDlg, IDC_AUDIOBUFFER, nullptr, FALSE);
+		gConfig.iVolume = TrackBar_GetPos(hwndDlg, IDC_VOLUME);
+		gConfig.iResampleQuality = TrackBar_GetPos(hwndDlg, IDC_QUALITY);
+		if (gConfig.eMusicType == MUSIC_RIX)
+		{
+			gConfig.fUseSurroundOPL = IsDlgButtonChecked(hwndDlg, IDC_SURROUNDOPL);
+			gConfig.iOPLSampleRate = GetDlgItemInt(hwndDlg, IDC_OPLSR, nullptr, FALSE);
+			gConfig.dSurroundOPLOffset = GetDlgItemInt(hwndDlg, IDC_OPLOFFSET, nullptr, TRUE);
+		}
+	}
+}
+
+void ResetControls(HWND hwndDlg)
+{
+	TCHAR buffer[100];
+
+	EnableDlgItem(hwndDlg, IDC_CHS, gConfig.fIsWIN95);
+	EnableDlgItem(hwndDlg, IDC_EMBEDFONT, !gConfig.fIsWIN95);
+	EnableDlgItem(hwndDlg, IDC_MSGFILE, gConfig.pszMsgName ? TRUE : FALSE);
+	EnableDlgItem(hwndDlg, IDC_OPL, gConfig.eMusicType == MUSIC_RIX);
+	EnableDlgItem(hwndDlg, IDC_SURROUNDOPL, gConfig.eMusicType == MUSIC_RIX);
+	EnableDlgItem(hwndDlg, IDC_OPLOFFSET, gConfig.eMusicType == MUSIC_RIX);
+	EnableDlgItem(hwndDlg, IDC_OPLSR, gConfig.eMusicType == MUSIC_RIX);
+
+	CheckRadioButton(hwndDlg, IDC_DOS, IDC_WIN95, gConfig.fIsWIN95 ? IDC_WIN95 : IDC_DOS);
+	CheckRadioButton(hwndDlg, IDC_CHT, IDC_CUSTOM, gConfig.pszMsgName ? IDC_CUSTOM : IDC_CHT + gConfig.iCodePage);
+
+	CheckDlgButton(hwndDlg, IDC_EMBEDFONT, gConfig.fUseEmbeddedFonts);
+	CheckDlgButton(hwndDlg, IDC_ASPECTRATIO, gConfig.fKeepAspectRatio);
+	CheckDlgButton(hwndDlg, IDC_SURROUNDOPL, gConfig.fUseSurroundOPL);
+	CheckDlgButton(hwndDlg, IDC_STEREO, gConfig.iAudioChannels == 2);
+
+	ComboBox_SetCurSel(hwndDlg, IDC_CD, gConfig.eCDType - MUSIC_MP3);
+	ComboBox_SetCurSel(hwndDlg, IDC_BGM, gConfig.eMusicType);
+	ComboBox_SetCurSel(hwndDlg, IDC_OPL, gConfig.eOPLType - OPL_DOSBOX);
+
+	SetDlgItemText(hwndDlg, IDC_WIDTH, _ultot(gConfig.dwScreenWidth, buffer, 10));
+	SetDlgItemText(hwndDlg, IDC_HEIGHT, _ultot(gConfig.dwScreenHeight, buffer, 10));
+	SetDlgItemText(hwndDlg, IDC_SAMPLERATE, _itot(gConfig.iSampleRate, buffer, 10));
+	SetDlgItemText(hwndDlg, IDC_OPLSR, _itot(gConfig.iOPLSampleRate, buffer, 10));
+	SetDlgItemText(hwndDlg, IDC_OPLOFFSET, _itot((int)gConfig.dSurroundOPLOffset, buffer, 10));
+	SetDlgItemText(hwndDlg, IDC_AUDIOBUFFER, _itot(gConfig.wAudioBufferSize, buffer, 10));
+
+	SetDlgItemTextA(hwndDlg, IDC_MSGFILE, gConfig.pszMsgName);
+
+	TrackBar_SetRange(hwndDlg, IDC_QUALITY, 0, 4, FALSE);
+	TrackBar_SetPos(hwndDlg, IDC_QUALITY, gConfig.iResampleQuality, TRUE);
+	TrackBar_SetRange(hwndDlg, IDC_VOLUME, 0, 100, FALSE);
+	TrackBar_SetPos(hwndDlg, IDC_VOLUME, gConfig.iVolume, TRUE);
+}
+
+INT_PTR InitProc(HWND hwndDlg, HWND hwndCtrl, LPARAM lParam)
+{
+	TCHAR curdir[MAX_PATH * 2];
+	GetCurrentDirectory(MAX_PATH * 2, curdir);
+
+	InitCommonControls();
+
+	ComboBox_AddString(hwndDlg, IDC_CD, TEXT("MP3"));
+	ComboBox_AddString(hwndDlg, IDC_CD, TEXT("OGG"));
+
+	ComboBox_AddString(hwndDlg, IDC_BGM, TEXT("RIX"));
+	ComboBox_AddString(hwndDlg, IDC_BGM, TEXT("MIDI"));
+	ComboBox_AddString(hwndDlg, IDC_BGM, TEXT("MP3"));
+	ComboBox_AddString(hwndDlg, IDC_BGM, TEXT("OGG"));
+
+	ComboBox_AddString(hwndDlg, IDC_OPL, TEXT("DOSBOX"));
+	ComboBox_AddString(hwndDlg, IDC_OPL, TEXT("MAME"));
+
+	SetDlgItemText(hwndDlg, IDC_GAMEPATH, curdir);
+
+	ResetControls(hwndDlg);
+
+	WINDOWINFO wi = { sizeof(WINDOWINFO) };
+	RECT rcWork;
+	if (SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWork, 0) && GetWindowInfo(hwndDlg, &wi))
+	{
+		int x = ((rcWork.right - rcWork.left) - (wi.rcWindow.right - wi.rcWindow.left)) / 2;
+		int y = ((rcWork.bottom - rcWork.top) - (wi.rcWindow.bottom - wi.rcWindow.top)) / 2;
+		SetWindowPos(hwndDlg, 0, x, y, 0, 0, SWP_NOSIZE | SWP_NOOWNERZORDER | SWP_SHOWWINDOW);
+	}
+
+	return TRUE;
+}
+
+INT_PTR ButtonProc(HWND hwndDlg, WORD idControl, HWND hwndCtrl)
+{
+	switch (idControl)
+	{
+	case IDOK:
+		SaveSettings(hwndDlg, FALSE);
+		EndDialog(hwndDlg, IDOK);
+		return TRUE;
+	case IDCANCEL:
+		EndDialog(hwndDlg, IDCANCEL);
+		return TRUE;
+
+	case IDC_SAVE:
+		SaveSettings(hwndDlg, TRUE);
+		return TRUE;
+	case IDC_DEFAULT:
+		PAL_LoadConfig(FALSE);
+		ResetControls(hwndDlg);
+		return TRUE;
+
+	case IDC_DOS:
+	case IDC_WIN95:
+		if (IsDlgButtonChecked(hwndDlg, IDC_DOS))
+		{
+			EnableDlgItem(hwndDlg, IDC_EMBEDFONT, TRUE);
+			EnableDlgItem(hwndDlg, IDC_CHS, FALSE);
+		}
+		else
+		{
+			EnableDlgItem(hwndDlg, IDC_EMBEDFONT, FALSE);
+			EnableDlgItem(hwndDlg, IDC_CHS, TRUE);
+		}
+		return TRUE;
+
+	case IDC_CHT:
+	case IDC_CHS:
+	case IDC_CUSTOM:
+		EnableDlgItem(hwndDlg, IDC_MSGFILE, IsDlgButtonChecked(hwndDlg, IDC_CUSTOM));
+		return TRUE;
+
+	default: return FALSE;
+	}
+}
+
+INT_PTR ComboBoxProc(HWND hwndDlg, WORD idControl, HWND hwndCtrl)
+{
+	switch (idControl)
+	{
+	case IDC_BGM:
+		EnableDlgItem(hwndDlg, IDC_OPL, ComboBox_GetCurSel(hwndDlg, IDC_BGM) == MUSIC_RIX);
+		EnableDlgItem(hwndDlg, IDC_SURROUNDOPL, ComboBox_GetCurSel(hwndDlg, IDC_BGM) == MUSIC_RIX);
+		EnableDlgItem(hwndDlg, IDC_OPLOFFSET, ComboBox_GetCurSel(hwndDlg, IDC_BGM) == MUSIC_RIX);
+		EnableDlgItem(hwndDlg, IDC_OPLSR, ComboBox_GetCurSel(hwndDlg, IDC_BGM) == MUSIC_RIX);
+		return TRUE;
+
+	default:
+		return FALSE;
+	}
+}
+
+INT_PTR CommandProc(HWND hwndDlg, WORD command, WORD idControl, HWND hwndCtrl)
+{
+	switch (command)
+	{
+	case BN_CLICKED: return ButtonProc(hwndDlg, idControl, hwndCtrl);
+	case CBN_SELCHANGE: return ComboBoxProc(hwndDlg, idControl, hwndCtrl);
+	default: return FALSE;
+	}
+}
+
+INT_PTR CALLBACK LauncherDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+	switch (uMsg)
+	{
+	case WM_INITDIALOG: return InitProc(hwndDlg, (HWND)wParam, lParam);
+	case WM_COMMAND: return CommandProc(hwndDlg, HIWORD(wParam), LOWORD(wParam), (HWND)lParam);
+	case WM_CLOSE: return EndDialog(hwndDlg, 0);
+	default: return FALSE;
+	}
+}
+
+extern "C" int UTIL_Platform_Init(int argc, char* argv[])
+{
+	auto module = GetModuleHandle(nullptr);
+	auto lang = GetThreadUILanguage();
+	if (PRIMARYLANGID(lang) == LANG_CHINESE)
+	{
+		if (SUBLANGID(lang) == SUBLANG_CHINESE_SIMPLIFIED || SUBLANGID(lang) == SUBLANG_CHINESE_SINGAPORE)
+			lang = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED);
+		else
+			lang = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL);
+	}
+	else
+		lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
+	auto dlg = (LPCDLGTEMPLATE)LockResource(LoadResource(module, FindResourceEx(module, RT_DIALOG, MAKEINTRESOURCE(IDD_LAUNCHER), lang)));
+	if (DialogBoxIndirect(GetModuleHandle(nullptr), dlg, nullptr, LauncherDialogProc) != IDOK)
+		return -1;
+	else
+		return 0;
+}
+
+extern "C" VOID UTIL_Platform_Quit(VOID) {}
+
+extern "C" BOOL
+UTIL_GetScreenSize(
+	DWORD *pdwScreenWidth,
+	DWORD *pdwScreenHeight
+)
+{
+	return (pdwScreenWidth && pdwScreenHeight && *pdwScreenWidth && *pdwScreenHeight);
+}