Browse Source

Configuration: Win32 GUI update & palcfg.c bug fix

LouYihua 7 years ago
parent
commit
840ebf25e3
6 changed files with 383 additions and 190 deletions
  1. 5 5
      palcfg.c
  2. 0 1
      palcfg.h
  3. 18 12
      win32/resource.h
  4. 253 153
      win32/sdlpal.rc
  5. 3 3
      win32/sdlpal.vcxproj.filters
  6. 104 16
      win32/win32.cpp

+ 5 - 5
palcfg.c

@@ -59,10 +59,10 @@ static const ConfigItem gConfigItems[PALCFG_ALL_MAX] = {
 	{ PALCFG_GAMEPATH,          PALCFG_STRING,   "GamePath",           8, MAKE_VALUE(NULL,     NULL, NULL) },
 	{ PALCFG_SAVEPATH,          PALCFG_STRING,   "SavePath",           8, MAKE_VALUE(NULL,     NULL, NULL) },
 	{ PALCFG_MESSAGEFILE,       PALCFG_STRING,   "MessageFileName",   15, MAKE_VALUE(NULL,     NULL, NULL) },
-	{ PALCFG_FONTFILE,          PALCFG_STRING,   "FontFileName",      11, MAKE_VALUE(NULL,     NULL, NULL) },
+	{ PALCFG_FONTFILE,          PALCFG_STRING,   "FontFileName",      12, MAKE_VALUE(NULL,     NULL, NULL) },
 	{ PALCFG_MUSIC,             PALCFG_STRING,   "Music",              5, MAKE_VALUE("RIX",    NULL, NULL) },
 	{ PALCFG_OPL,               PALCFG_STRING,   "OPL",                3, MAKE_VALUE("DOSBOX", NULL, NULL) },
-	{ PALCFG_LOGFILE,           PALCFG_STRING,   "LogFileName",        7, MAKE_VALUE(NULL,     NULL, NULL) },
+	{ PALCFG_LOGFILE,           PALCFG_STRING,   "LogFileName",       11, MAKE_VALUE(NULL,     NULL, NULL) },
 	{ PALCFG_RIXEXTRAINIT,      PALCFG_STRING,   "RIXExtraInit",      12, MAKE_VALUE(NULL,     NULL, NULL) },
 	{ PALCFG_CLIMIDIPLAYER,     PALCFG_STRING,   "CLIMIDIPlayer",     13, MAKE_VALUE(NULL,     NULL, NULL) },
 };
@@ -497,8 +497,8 @@ PAL_SaveConfig(
 		sprintf(buf, "%s=%s\n", PAL_ConfigName(PALCFG_MUSIC), music_types[gConfig.eMusicType]); fputs(buf, fp);
 		sprintf(buf, "%s=%s\n", PAL_ConfigName(PALCFG_OPL), opl_types[gConfig.eOPLType]); fputs(buf, fp);
 
-		if (gConfig.pszGamePath && *gConfig.pszGamePath && strncmp(gConfig.pszGamePath, PAL_PREFIX, strnlen(gConfig.pszGamePath, PAL_MAX_PATH)) != 0) { sprintf(buf, "%s=%s\n", PAL_ConfigName(PALCFG_GAMEPATH), gConfig.pszGamePath); fputs(buf, fp); }
-		if (gConfig.pszSavePath && *gConfig.pszSavePath && strncmp(gConfig.pszSavePath, PAL_SAVE_PREFIX, strnlen(gConfig.pszSavePath, PAL_MAX_PATH)) != 0) { sprintf(buf, "%s=%s\n", PAL_ConfigName(PALCFG_SAVEPATH), gConfig.pszSavePath); fputs(buf, fp); }
+		if (gConfig.pszGamePath && *gConfig.pszGamePath && strcmp(gConfig.pszGamePath, PAL_PREFIX) != 0) { sprintf(buf, "%s=%s\n", PAL_ConfigName(PALCFG_GAMEPATH), gConfig.pszGamePath); fputs(buf, fp); }
+		if (gConfig.pszSavePath && *gConfig.pszSavePath && strcmp(gConfig.pszSavePath, PAL_SAVE_PREFIX) != 0) { sprintf(buf, "%s=%s\n", PAL_ConfigName(PALCFG_SAVEPATH), gConfig.pszSavePath); fputs(buf, fp); }
 		if (gConfig.pszMsgFile && *gConfig.pszMsgFile) { sprintf(buf, "%s=%s\n", PAL_ConfigName(PALCFG_MESSAGEFILE), gConfig.pszMsgFile); fputs(buf, fp); }
 		if (gConfig.pszFontFile && *gConfig.pszFontFile) { sprintf(buf, "%s=%s\n", PAL_ConfigName(PALCFG_FONTFILE), gConfig.pszFontFile); fputs(buf, fp); }
 		if (gConfig.pszLogFile && *gConfig.pszLogFile) { sprintf(buf, "%s=%s\n", PAL_ConfigName(PALCFG_LOGFILE), gConfig.pszLogFile); fputs(buf, fp); }
@@ -582,7 +582,7 @@ PAL_SetConfigItem(
 	case PALCFG_WINDOWWIDTH:       gConfig.dwScreenWidth = value.uValue; break;
 	case PALCFG_GAMEPATH:
 		if (gConfig.pszGamePath) free(gConfig.pszGamePath);
-		gConfig.pszGamePath = value.sValue && value.sValue[0] ? strdup(value.sValue) : strdup(PAL_SAVE_PREFIX);
+		gConfig.pszGamePath = value.sValue && value.sValue[0] ? strdup(value.sValue) : strdup(PAL_PREFIX);
 		break;
 	case PALCFG_SAVEPATH:
 		if (gConfig.pszSavePath) free(gConfig.pszSavePath);

+ 0 - 1
palcfg.h

@@ -183,7 +183,6 @@ typedef struct tagCONFIGURATION
 	OPLTYPE          eOPLType;
 	WORD             wAudioBufferSize;
 	BOOL             fIsWIN95;
-	BOOL             fUseEmbeddedFonts;
 	BOOL             fUseSurroundOPL;
 	BOOL             fKeepAspectRatio;
 	BOOL             fFullScreen;

+ 18 - 12
win32/resource.h

@@ -2,19 +2,19 @@
 // Microsoft Visual C++ 生成的包含文件。
 // 供 sdlpal.rc 使用
 //
+#define APP_MANIFEST                    1
 #define IDI_SDLPAL                      101
 #define IDD_LAUNCHER                    101
 #define IDS_CONFIRM                     103
-#define APP_MANIFEST                    1
-#define IDC_GAMEPATH                    1000
-#define IDC_CHT                         1001
-#define IDC_CHS                         1002
-#define IDC_EMBEDFONT                   1003
-#define IDC_ASPECTRATIO                 1004
-#define IDC_FULLSCREEN                  1005
-#define IDC_TOUCHOVERLAY                1006
-#define IDC_MSGFILE                     1007
-#define IDC_BRGAME                      1008
+#define IDC_DEFAULT                     1000
+#define IDC_BRGAME                      1001
+#define IDC_GAMEPATH                    1002
+#define IDC_ASPECTRATIO                 1003
+#define IDC_FULLSCREEN                  1004
+#define IDC_TOUCHOVERLAY                1005
+#define IDC_USEMSGFILE                  1006
+#define IDC_BRMSG                       1007
+#define IDC_MSGFILE                     1008
 #define IDC_CD                          1009
 #define IDC_BGM                         1010
 #define IDC_OPL                         1011
@@ -26,7 +26,13 @@
 #define IDC_QUALITY                     1017
 #define IDC_SOUNDVOLUME                 1018
 #define IDC_MUSICVOLUME                 1019
-#define IDC_DEFAULT                     1020
+#define IDC_LOGLEVEL                    1020
+#define IDC_USEFONTFILE                 1021
+#define IDC_BRFONT                      1022
+#define IDC_FONTFILE                    1023
+#define IDC_USELOGFILE                  1024
+#define IDC_BRLOG                       1025
+#define IDC_LOGFILE                     1026
 #define IDC_STATIC                      -1
 
 // Next default values for new objects
@@ -35,7 +41,7 @@
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_NEXT_RESOURCE_VALUE        104
 #define _APS_NEXT_COMMAND_VALUE         40001
-#define _APS_NEXT_CONTROL_VALUE         1021
+#define _APS_NEXT_CONTROL_VALUE         1024
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif

+ 253 - 153
win32/sdlpal.rc

@@ -24,52 +24,59 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
 // Dialog
 //
 
-IDD_LAUNCHER DIALOGEX 0, 0, 405, 206
+IDD_LAUNCHER DIALOGEX 0, 0, 405, 250
 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,177,185,50,14
-    PUSHBUTTON      "E&xit",IDCANCEL,7,185,50,14
+    DEFPUSHBUTTON   "&Launch game",IDOK,177,229,50,14
+    PUSHBUTTON      "E&xit",IDCANCEL,7,229,50,14
     LTEXT           "Game resource path:",IDC_STATIC,14,10,68,8
     EDITTEXT        IDC_GAMEPATH,84,7,256,14,ES_AUTOHSCROLL | ES_READONLY
-    LTEXT           "CD source:",IDC_STATIC,14,106,36,8
-    GROUPBOX        "Game Language",IDC_STATIC,7,28,192,50
-    CONTROL         "&Traditional Chinese",IDC_CHT,"Button",BS_AUTORADIOBUTTON | WS_GROUP,14,44,77,10
-    CONTROL         "Simplified &Chinese",IDC_CHS,"Button",BS_AUTORADIOBUTTON,102,44,73,10
-    CONTROL         "Use &embedded font",IDC_EMBEDFONT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,215,44,79,10
-    GROUPBOX        "Display",IDC_STATIC,206,28,192,50
-    CONTROL         "&Keep aspect ratio",IDC_ASPECTRATIO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,215,60,72,10
-    LTEXT           "BGM source:",IDC_STATIC,115,106,41,8
-    CONTROL         "&Full screen",IDC_FULLSCREEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,310,44,50,10
-    EDITTEXT        IDC_MSGFILE,59,57,131,14,ES_AUTOHSCROLL
-    GROUPBOX        "Audio",IDC_STATIC,7,86,391,85
-    COMBOBOX        IDC_CD,54,103,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_BGM,157,103,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "OPL type:",IDC_STATIC,14,125,33,8
-    COMBOBOX        IDC_OPL,54,122,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "S&tereo",IDC_STEREO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,225,106,37,10
-    PUSHBUTTON      "&Default",IDC_DEFAULT,348,185,50,14
-    CONTROL         "Surround &OPL",IDC_SURROUNDOPL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,225,125,55,10
-    LTEXT           "Audio sample rate:                      Hz",IDC_STATIC,280,106,113,8
-    EDITTEXT        IDC_SAMPLERATE,342,103,40,14,ES_AUTOHSCROLL | ES_NUMBER
-    LTEXT           "OPL sample rate:                       Hz",IDC_STATIC,108,125,110,8
-    EDITTEXT        IDC_OPLSR,165,122,40,14,ES_AUTOHSCROLL | ES_NUMBER
-    LTEXT           "Audio buffer:",IDC_STATIC,298,125,44,8
-    EDITTEXT        IDC_AUDIOBUFFER,342,122,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    LTEXT           "CD source:",IDC_STATIC,14,160,36,8
+    GROUPBOX        "Font && Language",IDC_STATIC,7,30,391,50
+    GROUPBOX        "Display",IDC_STATIC,7,110,391,30
+    CONTROL         "&Keep aspect ratio",IDC_ASPECTRATIO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,150,124,72,10
+    LTEXT           "BGM source:",IDC_STATIC,115,160,41,8
+    CONTROL         "&Full screen",IDC_FULLSCREEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,124,50,10
+    EDITTEXT        IDC_MSGFILE,70,61,270,14,ES_AUTOHSCROLL | ES_READONLY
+    GROUPBOX        "Audio",IDC_STATIC,7,140,391,85
+    COMBOBOX        IDC_CD,54,157,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_BGM,157,157,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    LTEXT           "OPL type:",IDC_STATIC,14,179,33,8
+    COMBOBOX        IDC_OPL,54,176,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "S&tereo",IDC_STEREO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,225,160,37,10
+    PUSHBUTTON      "&Default",IDC_DEFAULT,348,229,50,14
+    CONTROL         "Surround &OPL",IDC_SURROUNDOPL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,225,179,55,10
+    LTEXT           "Audio sample rate:                      Hz",IDC_STATIC,280,160,113,8
+    EDITTEXT        IDC_SAMPLERATE,342,157,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    LTEXT           "OPL sample rate:                       Hz",IDC_STATIC,108,179,110,8
+    EDITTEXT        IDC_OPLSR,165,176,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    LTEXT           "Audio buffer:",IDC_STATIC,298,179,44,8
+    EDITTEXT        IDC_AUDIOBUFFER,342,176,40,14,ES_AUTOHSCROLL | ES_NUMBER
     PUSHBUTTON      "&Browse",IDC_BRGAME,348,7,50,14
-    LTEXT           "Message file:",IDC_STATIC,14,60,43,8
-    CONTROL         "Enable &touch overlay",IDC_TOUCHOVERLAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,310,60,83,10
-    LTEXT           "Quality:",IDC_STATIC,14,144,26,8
-    LTEXT           "Low                              High",IDC_STATIC,31,158,88,8
-    CONTROL         "",IDC_QUALITY,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,43,143,60,15
-    LTEXT           "Music volume:",IDC_STATIC,118,144,46,8
-    LTEXT           "Low                                      High",IDC_STATIC,153,158,104,8
-    CONTROL         "",IDC_MUSICVOLUME,"msctls_trackbar32",WS_TABSTOP,165,143,80,15
-    LTEXT           "Sound volume:",IDC_STATIC,256,145,48,8
-    LTEXT           "Low                                      High",IDC_STATIC,291,158,104,8
-    CONTROL         "",IDC_SOUNDVOLUME,"msctls_trackbar32",WS_TABSTOP,303,144,80,15
+    CONTROL         "Message file:",IDC_USEMSGFILE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,64,56,8
+    CONTROL         "Enable &touch overlay",IDC_TOUCHOVERLAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,306,124,83,10
+    LTEXT           "Quality:",IDC_STATIC,14,198,26,8
+    LTEXT           "Low                              High",IDC_STATIC,31,212,88,8
+    CONTROL         "",IDC_QUALITY,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,43,197,60,15
+    LTEXT           "Music volume:",IDC_STATIC,118,198,46,8
+    LTEXT           "Low                                      High",IDC_STATIC,153,212,104,8
+    CONTROL         "",IDC_MUSICVOLUME,"msctls_trackbar32",WS_TABSTOP,165,197,80,15
+    LTEXT           "Sound volume:",IDC_STATIC,256,199,48,8
+    LTEXT           "Low                                      High",IDC_STATIC,291,212,104,8
+    CONTROL         "",IDC_SOUNDVOLUME,"msctls_trackbar32",WS_TABSTOP,303,198,80,15
+    EDITTEXT        IDC_FONTFILE,70,43,270,14,ES_AUTOHSCROLL | ES_READONLY
+    CONTROL         "Font file:",IDC_USEFONTFILE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,46,56,8
+    GROUPBOX        "Logging",IDC_STATIC,7,80,391,30
+    LTEXT           "Log level:",IDC_STATIC,14,95,32,8
+    COMBOBOX        IDC_LOGLEVEL,46,92,61,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Log file:",IDC_USELOGFILE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,95,40,8
+    EDITTEXT        IDC_LOGFILE,160,92,180,14,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "&Browse",IDC_BRFONT,348,43,50,14,WS_DISABLED
+    PUSHBUTTON      "&Browse",IDC_BRMSG,348,61,50,14,WS_DISABLED
+    PUSHBUTTON      "&Browse",IDC_BRLOG,348,92,50,14,WS_DISABLED
 END
 
 
@@ -86,7 +93,7 @@ BEGIN
         LEFTMARGIN, 7
         RIGHTMARGIN, 398
         TOPMARGIN, 7
-        BOTTOMMARGIN, 199
+        BOTTOMMARGIN, 243
     END
 END
 #endif    // APSTUDIO_INVOKED
@@ -110,22 +117,32 @@ END
 
 IDD_LAUNCHER DLGINIT
 BEGIN
-    IDC_CD, 0x403, 4, 0,
+    IDC_CD, 0x403, 4, 0
 0x504d, 0x0033, 
-    IDC_CD, 0x403, 4, 0,
+    IDC_CD, 0x403, 4, 0
 0x474f, 0x0047, 
-    IDC_BGM, 0x403, 4, 0,
+    IDC_BGM, 0x403, 4, 0
 0x4952, 0x0058, 
-    IDC_BGM, 0x403, 5, 0,
-0x494d, 0x4944, "\000", 
-    IDC_BGM, 0x403, 4, 0,
+    IDC_BGM, 0x403, 5, 0
+0x494d, 0x4944, "\000" 
+    IDC_BGM, 0x403, 4, 0
 0x504d, 0x0033, 
-    IDC_BGM, 0x403, 4, 0,
+    IDC_BGM, 0x403, 4, 0
 0x474f, 0x0047, 
-    IDC_OPL, 0x403, 7, 0,
-0x4f44, 0x4253, 0x584f, "\000", 
-    IDC_OPL, 0x403, 5, 0,
-0x414d, 0x454d, "\000", 
+    IDC_OPL, 0x403, 7, 0
+0x4f44, 0x4253, 0x584f, "\000" 
+    IDC_OPL, 0x403, 5, 0
+0x414d, 0x454d, "\000" 
+    IDC_LOGLEVEL, 0x403, 8, 0
+0x6556, 0x6272, 0x736f, 0x0065, 
+    IDC_LOGLEVEL, 0x403, 6, 0
+0x6544, 0x7562, 0x0067, 
+    IDC_LOGLEVEL, 0x403, 14, 0
+0x6e49, 0x6f66, 0x6d72, 0x7461, 0x6f69, 0x616e, 0x006c, 
+    IDC_LOGLEVEL, 0x403, 8, 0
+0x6157, 0x6e72, 0x6e69, 0x0067, 
+    IDC_LOGLEVEL, 0x403, 6, 0
+0x6146, 0x6174, 0x006c, 
     0
 END
 
@@ -200,6 +217,21 @@ END
 STRINGTABLE
 BEGIN
     IDC_BRGAME              "Open game resource folder"
+    IDC_BRMSG               "Select customized game message file"
+END
+
+STRINGTABLE
+BEGIN
+    IDC_MSGFILE             "Message file (*.msg)|*.msg||"
+    IDC_LOGLEVEL            "Verbose;Debug;Informational;Warning;Error;Fatal"
+    IDC_BRFONT              "Select customized font file"
+    IDC_FONTFILE            "Font file (*.bdf)|*.bdf||"
+END
+
+STRINGTABLE
+BEGIN
+    IDC_BRLOG               "Select file to record logs"
+    IDC_LOGFILE             "Log file (*.log, *.txt)|*.log;*.txt||"
 END
 
 #endif    // 非特定语言 resources
@@ -218,52 +250,59 @@ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
 // Dialog
 //
 
-IDD_LAUNCHER DIALOGEX 0, 0, 405, 206
+IDD_LAUNCHER DIALOGEX 0, 0, 405, 250
 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,177,185,50,14
-    PUSHBUTTON      "退出(&X)",IDCANCEL,7,185,50,14
-    LTEXT           "游戏资源目录:",IDC_STATIC,14,10,57,8
-    EDITTEXT        IDC_GAMEPATH,71,7,270,14,ES_AUTOHSCROLL | ES_READONLY
-    LTEXT           "CD 音源:",IDC_STATIC,14,106,36,8
-    GROUPBOX        "游戏语言设置",IDC_STATIC,7,28,192,50
-    CONTROL         "繁体中文(&T)",IDC_CHT,"Button",BS_AUTORADIOBUTTON | WS_GROUP,14,44,57,10
-    CONTROL         "简体中文(&C)",IDC_CHS,"Button",BS_AUTORADIOBUTTON,102,44,58,10
-    CONTROL         "使用游戏内字体(&E)",IDC_EMBEDFONT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,215,44,81,10
-    GROUPBOX        "显示设置",IDC_STATIC,206,28,192,50
-    CONTROL         "保持纵横比(&K)",IDC_ASPECTRATIO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,215,60,65,10
-    LTEXT           "BGM 音源:",IDC_STATIC,115,106,41,8
-    CONTROL         "全屏启动游戏(&F)",IDC_FULLSCREEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,310,44,73,10
-    EDITTEXT        IDC_MSGFILE,57,57,133,14,ES_AUTOHSCROLL
-    GROUPBOX        "音频设置",IDC_STATIC,7,86,391,85
-    COMBOBOX        IDC_CD,54,103,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_BGM,157,103,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "OPL 类型:",IDC_STATIC,14,125,40,8
-    COMBOBOX        IDC_OPL,54,122,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "立体声(&T)",IDC_STEREO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,225,106,49,10
-    PUSHBUTTON      "默认设置(&D)",IDC_DEFAULT,348,185,50,14
-    CONTROL         "环绕声 &OPL",IDC_SURROUNDOPL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,225,125,55,10
-    LTEXT           "音频采样率:                      Hz",IDC_STATIC,285,106,101,8
-    EDITTEXT        IDC_SAMPLERATE,335,103,40,14,ES_AUTOHSCROLL | ES_NUMBER
-    LTEXT           "OPL 采样率:                       Hz",IDC_STATIC,115,125,102,8
-    EDITTEXT        IDC_OPLSR,165,122,40,14,ES_AUTOHSCROLL | ES_NUMBER
-    LTEXT           "音频缓冲区:",IDC_STATIC,285,125,49,8
-    EDITTEXT        IDC_AUDIOBUFFER,335,122,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    DEFPUSHBUTTON   "启动游戏(&L)",IDOK,177,229,50,14
+    PUSHBUTTON      "退出(&X)",IDCANCEL,7,229,50,14
+    LTEXT           "游戏资源目录:",IDC_STATIC,14,10,56,8
+    EDITTEXT        IDC_GAMEPATH,70,7,270,14,ES_AUTOHSCROLL | ES_READONLY
+    LTEXT           "CD 音源:",IDC_STATIC,14,160,36,8
+    GROUPBOX        "字体及语言设置",IDC_STATIC,7,30,391,50
+    GROUPBOX        "显示设置",IDC_STATIC,7,110,391,30
+    CONTROL         "保持纵横比(&K)",IDC_ASPECTRATIO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,160,124,65,10
+    LTEXT           "BGM 音源:",IDC_STATIC,115,160,41,8
+    CONTROL         "全屏启动游戏(&F)",IDC_FULLSCREEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,124,73,10
+    EDITTEXT        IDC_MSGFILE,70,61,270,14,ES_AUTOHSCROLL | ES_READONLY
+    GROUPBOX        "音频设置",IDC_STATIC,7,140,391,85
+    COMBOBOX        IDC_CD,54,157,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_BGM,157,157,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    LTEXT           "OPL 类型:",IDC_STATIC,14,179,40,8
+    COMBOBOX        IDC_OPL,54,176,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "立体声(&T)",IDC_STEREO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,225,160,49,10
+    PUSHBUTTON      "默认设置(&D)",IDC_DEFAULT,348,229,50,14
+    CONTROL         "环绕声 &OPL",IDC_SURROUNDOPL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,225,179,55,10
+    LTEXT           "音频采样率:                      Hz",IDC_STATIC,285,160,101,8
+    EDITTEXT        IDC_SAMPLERATE,335,157,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    LTEXT           "OPL 采样率:                       Hz",IDC_STATIC,115,179,102,8
+    EDITTEXT        IDC_OPLSR,165,176,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    LTEXT           "音频缓冲区:",IDC_STATIC,285,179,49,8
+    EDITTEXT        IDC_AUDIOBUFFER,335,176,40,14,ES_AUTOHSCROLL | ES_NUMBER
     PUSHBUTTON      "浏览(&B)",IDC_BRGAME,348,7,50,14
-    LTEXT           "语言文件:",IDC_STATIC,14,60,41,8
-    CONTROL         "启用触屏辅助(&T)",IDC_TOUCHOVERLAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,310,60,73,10
-    LTEXT           "音频质量:",IDC_STATIC,14,144,41,8
-    LTEXT           "低                              高",IDC_STATIC,47,158,77,8
-    CONTROL         "",IDC_QUALITY,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,55,143,60,15
-    LTEXT           "音乐音量:",IDC_STATIC,131,144,41,8
-    CONTROL         "",IDC_MUSICVOLUME,"msctls_trackbar32",WS_TABSTOP,172,143,80,15
-    LTEXT           "低                                      高",IDC_STATIC,165,158,93,8
-    LTEXT           "音效音量:",IDC_STATIC,266,145,41,8
-    CONTROL         "",IDC_SOUNDVOLUME,"msctls_trackbar32",WS_TABSTOP,307,144,80,15
-    LTEXT           "低                                      高",IDC_STATIC,300,158,93,8
+    CONTROL         "语言文件:",IDC_USEMSGFILE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,64,56,8
+    CONTROL         "启用触屏辅助(&T)",IDC_TOUCHOVERLAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,309,124,73,10
+    LTEXT           "音频质量:",IDC_STATIC,14,198,41,8
+    LTEXT           "低                              高",IDC_STATIC,47,212,77,8
+    CONTROL         "",IDC_QUALITY,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,55,197,60,15
+    LTEXT           "音乐音量:",IDC_STATIC,131,198,41,8
+    CONTROL         "",IDC_MUSICVOLUME,"msctls_trackbar32",WS_TABSTOP,172,197,80,15
+    LTEXT           "低                                      高",IDC_STATIC,165,212,93,8
+    LTEXT           "音效音量:",IDC_STATIC,266,199,41,8
+    CONTROL         "",IDC_SOUNDVOLUME,"msctls_trackbar32",WS_TABSTOP,307,198,80,15
+    LTEXT           "低                                      高",IDC_STATIC,300,212,93,8
+    EDITTEXT        IDC_FONTFILE,70,43,270,14,ES_AUTOHSCROLL | ES_READONLY
+    CONTROL         "字体文件:",IDC_USEFONTFILE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,46,56,8
+    GROUPBOX        "日志记录设置",IDC_STATIC,7,80,391,30
+    LTEXT           "记录级别:",IDC_STATIC,14,95,41,8
+    COMBOBOX        IDC_LOGLEVEL,57,92,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "记录到文件:",IDC_USELOGFILE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,95,55,8
+    EDITTEXT        IDC_LOGFILE,175,92,165,14,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "浏览(&B)",IDC_BRFONT,348,43,50,14,WS_DISABLED
+    PUSHBUTTON      "浏览(&B)",IDC_BRMSG,348,61,50,14,WS_DISABLED
+    PUSHBUTTON      "浏览(&B)",IDC_BRLOG,348,92,50,14,WS_DISABLED
 END
 
 
@@ -280,7 +319,7 @@ BEGIN
         LEFTMARGIN, 7
         RIGHTMARGIN, 398
         TOPMARGIN, 7
-        BOTTOMMARGIN, 199
+        BOTTOMMARGIN, 243
     END
 END
 #endif    // APSTUDIO_INVOKED
@@ -304,22 +343,34 @@ END
 
 IDD_LAUNCHER DLGINIT
 BEGIN
-    IDC_CD, 0x403, 4, 0,
+    IDC_CD, 0x403, 4, 0
 0x504d, 0x0033, 
-    IDC_CD, 0x403, 4, 0,
+    IDC_CD, 0x403, 4, 0
 0x474f, 0x0047, 
-    IDC_BGM, 0x403, 4, 0,
+    IDC_BGM, 0x403, 4, 0
 0x4952, 0x0058, 
-    IDC_BGM, 0x403, 5, 0,
-0x494d, 0x4944, "\000", 
-    IDC_BGM, 0x403, 4, 0,
+    IDC_BGM, 0x403, 5, 0
+0x494d, 0x4944, "\000" 
+    IDC_BGM, 0x403, 4, 0
 0x504d, 0x0033, 
-    IDC_BGM, 0x403, 4, 0,
+    IDC_BGM, 0x403, 4, 0
 0x474f, 0x0047, 
-    IDC_OPL, 0x403, 7, 0,
-0x4f44, 0x4253, 0x584f, "\000", 
-    IDC_OPL, 0x403, 5, 0,
-0x414d, 0x454d, "\000", 
+    IDC_OPL, 0x403, 7, 0
+0x4f44, 0x4253, 0x584f, "\000" 
+    IDC_OPL, 0x403, 5, 0
+0x414d, 0x454d, "\000" 
+    IDC_LOGLEVEL, 0x403, 5, 0
+0xeacf, 0xb8cf, "\000" 
+    IDC_LOGLEVEL, 0x403, 5, 0
+0xf7b5, 0xd4ca, "\000" 
+    IDC_LOGLEVEL, 0x403, 5, 0
+0xc5d0, 0xa2cf, "\000" 
+    IDC_LOGLEVEL, 0x403, 5, 0
+0xafbe, 0xe6b8, "\000" 
+    IDC_LOGLEVEL, 0x403, 5, 0
+0xedb4, 0xf3ce, "\000" 
+    IDC_LOGLEVEL, 0x403, 5, 0
+0xc2d6, 0xfcc3, "\000" 
     0
 END
 
@@ -363,6 +414,21 @@ END
 STRINGTABLE
 BEGIN
     IDC_BRGAME              "打开游戏资源文件夹"
+    IDC_BRMSG               "选择自定义游戏语言文件"
+END
+
+STRINGTABLE
+BEGIN
+    IDC_MSGFILE             "语言文件(*.msg)|*.msg||"
+    IDC_LOGLEVEL            "详细;调试;信息;警告;错误;致命"
+    IDC_BRFONT              "选择自定义字体文件"
+    IDC_FONTFILE            "字体文件(*.bdf)|*.bdf||"
+END
+
+STRINGTABLE
+BEGIN
+    IDC_BRLOG               "选择用于日志记录的文件"
+    IDC_LOGFILE             "日志文件(*.log, *.txt)|*.log;*.txt||"
 END
 
 #endif    // 中文(简体,中国) resources
@@ -381,52 +447,59 @@ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL
 // Dialog
 //
 
-IDD_LAUNCHER DIALOGEX 0, 0, 405, 206
+IDD_LAUNCHER DIALOGEX 0, 0, 405, 250
 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,177,185,50,14
-    PUSHBUTTON      "癶�(&X)",IDCANCEL,7,185,50,14
+    DEFPUSHBUTTON   "币笆笴栏(&L)",IDOK,177,229,50,14
+    PUSHBUTTON      "癶�(&X)",IDCANCEL,7,229,50,14
     LTEXT           "笴栏戈方郎Ж�",IDC_STATIC,14,10,57,8
-    EDITTEXT        IDC_GAMEPATH,71,7,270,14,ES_AUTOHSCROLL | ES_READONLY
-    LTEXT           "CD �方�",IDC_STATIC,14,106,36,8
-    GROUPBOX        "笴栏粂ē砞﹚",IDC_STATIC,7,28,192,50
-    CONTROL         "羉砰いゅ(&T)",IDC_CHT,"Button",BS_AUTORADIOBUTTON | WS_GROUP,14,44,57,10
-    CONTROL         "虏砰いゅ(&C)",IDC_CHS,"Button",BS_AUTORADIOBUTTON,102,44,58,10
-    CONTROL         "ㄏノ笴栏ず�砰(&E)",IDC_EMBEDFONT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,215,44,81,10
-    GROUPBOX        "陪ボ砞﹚",IDC_STATIC,206,28,192,50
-    CONTROL         "玂�羇绢ゑ(&K)",IDC_ASPECTRATIO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,215,60,65,10
-    LTEXT           "BGM �方�",IDC_STATIC,115,106,41,8
-    CONTROL         "��币笆笴栏(&F)",IDC_FULLSCREEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,310,44,73,10
-    EDITTEXT        IDC_MSGFILE,57,57,133,14,ES_AUTOHSCROLL
-    GROUPBOX        "�癟砞﹚",IDC_STATIC,7,86,391,85
-    COMBOBOX        IDC_CD,54,103,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_BGM,157,103,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "OPL 摸��",IDC_STATIC,14,124,40,8
-    COMBOBOX        IDC_OPL,54,121,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "ミ砰羘(&T)",IDC_STEREO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,230,106,49,10
-    PUSHBUTTON      "纐粄砞﹚(&D)",IDC_DEFAULT,348,185,50,14
-    CONTROL         "吏露羘 &OPL",IDC_SURROUNDOPL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,230,124,55,10
-    LTEXT           "�癟�妓硉瞯�                      Hz",IDC_STATIC,285,106,109,8
-    EDITTEXT        IDC_SAMPLERATE,342,103,40,14,ES_AUTOHSCROLL | ES_NUMBER
-    LTEXT           "OPL �妓硉瞯�                       Hz",IDC_STATIC,115,124,110,8
-    EDITTEXT        IDC_OPLSR,172,121,40,14,ES_AUTOHSCROLL | ES_NUMBER
-    LTEXT           "�癟珇借�",IDC_STATIC,14,144,41,8
-    CONTROL         "",IDC_QUALITY,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,55,143,60,15
-    LTEXT           "�癟絯侥跋�",IDC_STATIC,293,124,48,8
-    EDITTEXT        IDC_AUDIOBUFFER,342,121,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    EDITTEXT        IDC_GAMEPATH,70,7,270,14,ES_AUTOHSCROLL | ES_READONLY
+    LTEXT           "CD �方�",IDC_STATIC,14,160,36,8
+    GROUPBOX        "�砰の粂ē砞﹚",IDC_STATIC,7,30,391,50
+    GROUPBOX        "陪ボ砞﹚",IDC_STATIC,7,110,391,30
+    CONTROL         "玂�羇绢ゑ(&K)",IDC_ASPECTRATIO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,160,124,65,10
+    LTEXT           "BGM �方�",IDC_STATIC,115,160,41,8
+    CONTROL         "��币笆笴栏(&F)",IDC_FULLSCREEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,124,73,10
+    EDITTEXT        IDC_MSGFILE,70,61,270,14,ES_AUTOHSCROLL | ES_READONLY
+    GROUPBOX        "�癟砞﹚",IDC_STATIC,7,140,391,85
+    COMBOBOX        IDC_CD,54,157,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_BGM,157,157,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    LTEXT           "OPL 摸��",IDC_STATIC,14,178,40,8
+    COMBOBOX        IDC_OPL,54,175,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "ミ砰羘(&T)",IDC_STEREO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,230,160,49,10
+    PUSHBUTTON      "纐粄砞﹚(&D)",IDC_DEFAULT,348,229,50,14
+    CONTROL         "吏露羘 &OPL",IDC_SURROUNDOPL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,230,178,55,10
+    LTEXT           "�癟�妓硉瞯�                      Hz",IDC_STATIC,285,160,109,8
+    EDITTEXT        IDC_SAMPLERATE,342,157,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    LTEXT           "OPL �妓硉瞯�                       Hz",IDC_STATIC,115,178,110,8
+    EDITTEXT        IDC_OPLSR,172,175,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    LTEXT           "�癟珇借�",IDC_STATIC,14,198,41,8
+    CONTROL         "",IDC_QUALITY,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,55,197,60,15
+    LTEXT           "�癟絯侥跋�",IDC_STATIC,293,178,48,8
+    EDITTEXT        IDC_AUDIOBUFFER,342,175,40,14,ES_AUTOHSCROLL | ES_NUMBER
     PUSHBUTTON      "聅凝(&B)",IDC_BRGAME,348,7,50,14
-    LTEXT           "粂ē郎�",IDC_STATIC,14,60,33,8
-    CONTROL         "币ノ牟�徊�(&T)",IDC_TOUCHOVERLAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,310,60,73,10
-    LTEXT           "�                              蔼",IDC_STATIC,47,158,77,8
-    LTEXT           "�贾�秖�",IDC_STATIC,131,144,41,8
-    CONTROL         "",IDC_MUSICVOLUME,"msctls_trackbar32",WS_TABSTOP,172,143,80,15
-    LTEXT           "�                                      蔼",IDC_STATIC,165,158,93,8
-    LTEXT           "���秖�",IDC_STATIC,266,145,41,8
-    CONTROL         "",IDC_SOUNDVOLUME,"msctls_trackbar32",WS_TABSTOP,307,144,80,15
-    LTEXT           "�                                      蔼",IDC_STATIC,300,158,93,8
+    CONTROL         "�璹粂ē郎�",IDC_USEMSGFILE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,64,56,8
+    CONTROL         "币ノ牟�徊�(&T)",IDC_TOUCHOVERLAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,309,124,73,10
+    LTEXT           "�                              蔼",IDC_STATIC,47,212,77,8
+    LTEXT           "�贾�秖�",IDC_STATIC,131,198,41,8
+    CONTROL         "",IDC_MUSICVOLUME,"msctls_trackbar32",WS_TABSTOP,172,197,80,15
+    LTEXT           "�                                      蔼",IDC_STATIC,165,212,93,8
+    LTEXT           "���秖�",IDC_STATIC,266,199,41,8
+    CONTROL         "",IDC_SOUNDVOLUME,"msctls_trackbar32",WS_TABSTOP,307,198,80,15
+    LTEXT           "�                                      蔼",IDC_STATIC,300,212,93,8
+    EDITTEXT        IDC_FONTFILE,70,43,270,14,ES_AUTOHSCROLL | ES_READONLY
+    CONTROL         "�璹�砰郎�",IDC_USEFONTFILE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,46,56,8
+    GROUPBOX        "ら粁癘魁砞﹚",IDC_STATIC,7,80,391,30
+    LTEXT           "癘魁���",IDC_STATIC,14,95,41,8
+    COMBOBOX        IDC_LOGLEVEL,57,92,48,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "癘魁�郎�",IDC_USELOGFILE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,95,50,8
+    EDITTEXT        IDC_LOGFILE,170,92,170,14,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "聅凝(&B)",IDC_BRFONT,348,43,50,14,WS_DISABLED
+    PUSHBUTTON      "聅凝(&B)",IDC_BRMSG,348,61,50,14,WS_DISABLED
+    PUSHBUTTON      "聅凝(&B)",IDC_BRLOG,348,92,50,14,WS_DISABLED
 END
 
 
@@ -443,7 +516,7 @@ BEGIN
         LEFTMARGIN, 7
         RIGHTMARGIN, 398
         TOPMARGIN, 7
-        BOTTOMMARGIN, 199
+        BOTTOMMARGIN, 243
     END
 END
 #endif    // APSTUDIO_INVOKED
@@ -467,22 +540,34 @@ END
 
 IDD_LAUNCHER DLGINIT
 BEGIN
-    IDC_CD, 0x403, 4, 0,
+    IDC_CD, 0x403, 4, 0
 0x504d, 0x0033, 
-    IDC_CD, 0x403, 4, 0,
+    IDC_CD, 0x403, 4, 0
 0x474f, 0x0047, 
-    IDC_BGM, 0x403, 4, 0,
+    IDC_BGM, 0x403, 4, 0
 0x4952, 0x0058, 
-    IDC_BGM, 0x403, 5, 0,
-0x494d, 0x4944, "\000", 
-    IDC_BGM, 0x403, 4, 0,
+    IDC_BGM, 0x403, 5, 0
+0x494d, 0x4944, "\000" 
+    IDC_BGM, 0x403, 4, 0
 0x504d, 0x0033, 
-    IDC_BGM, 0x403, 4, 0,
+    IDC_BGM, 0x403, 4, 0
 0x474f, 0x0047, 
-    IDC_OPL, 0x403, 7, 0,
-0x4f44, 0x4253, 0x584f, "\000", 
-    IDC_OPL, 0x403, 5, 0,
-0x414d, 0x454d, "\000", 
+    IDC_OPL, 0x403, 7, 0
+0x4f44, 0x4253, 0x584f, "\000" 
+    IDC_OPL, 0x403, 5, 0
+0x414d, 0x454d, "\000" 
+    IDC_LOGLEVEL, 0x403, 5, 0
+0xd4b8, 0xd3b2, "\000" 
+    IDC_LOGLEVEL, 0x403, 5, 0
+0xd5bd, 0xd5b8, "\000" 
+    IDC_LOGLEVEL, 0x403, 5, 0
+0x48ab, 0xa7ae, "\000" 
+    IDC_LOGLEVEL, 0x403, 5, 0
+0xb5c4, 0x69a7, "\000" 
+    IDC_LOGLEVEL, 0x403, 5, 0
+0xf9bf, 0x7ebb, "\000" 
+    IDC_LOGLEVEL, 0x403, 5, 0
+0x50ad, 0x52a9, "\000" 
     0
 END
 
@@ -500,6 +585,21 @@ END
 STRINGTABLE
 BEGIN
     IDC_BRGAME              "ゴ秨笴栏戈方郎Ж"
+    IDC_BRMSG               "匡拒�璹粂ē郎"
+END
+
+STRINGTABLE
+BEGIN
+    IDC_MSGFILE             "粂ē郎(*.msg)|*.msg||"
+    IDC_LOGLEVEL            "冈灿;秸刚;獺�;牡�;岿粇;璓㏑"
+    IDC_BRFONT              "匡拒�璹�砰郎"
+    IDC_FONTFILE            "�砰郎(*.bdf)|*.bdf||"
+END
+
+STRINGTABLE
+BEGIN
+    IDC_BRLOG               "匡拒ノ�ら粁癘魁�郎"
+    IDC_LOGFILE             "ら粁郎(*.log, *.txt)|*.log;*.txt||"
 END
 
 #endif    // 中文(繁体,中国台湾) resources

+ 3 - 3
win32/sdlpal.vcxproj.filters

@@ -658,9 +658,6 @@
     <ClInclude Include="..\liboggvorbis\include\ogg\config_types.h">
       <Filter>liboggvorbis\include\ogg</Filter>
     </ClInclude>
-    <ClInclude Include="resource.h">
-      <Filter>platform</Filter>
-    </ClInclude>
     <ClInclude Include="..\palcfg.h">
       <Filter>Header Files</Filter>
     </ClInclude>
@@ -670,6 +667,9 @@
     <ClInclude Include="pal_config.h">
       <Filter>platform</Filter>
     </ClInclude>
+    <ClInclude Include="resource.h">
+      <Filter>Resource Files</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\sdlpal.ico">

+ 104 - 16
win32/win32.cpp

@@ -91,16 +91,24 @@ int WINAPI LoadStringEx(
 	}
 }
 
+std::wstring LoadResourceString(UINT uID)
+{
+	auto hrc = FindResourceEx(g_hInstance, RT_STRING, MAKEINTRESOURCE((uID >> 4) + 1), g_wLanguage);
+	if (hrc)
+	{
+		auto begin = (LPCWSTR)LockResource(LoadResource(g_hInstance, hrc));
+		for (int idx = 0; idx < (int)(uID & 0xf); idx++)
+			begin += *begin + 1;
+		return std::wstring(begin + 1, *begin);
+	}
+	return L"";
+}
+
 void SaveSettings(HWND hwndDlg, BOOL fWriteFile)
 {
 	int textLen;
 
-	if (IsDlgButtonChecked(hwndDlg, IDC_CHS))
-		gConfig.uCodePage = CP_GBK;
-	else
-		gConfig.uCodePage = CP_BIG5;
-
-	if ((textLen = GetWindowTextLengthA(GetDlgItem(hwndDlg, IDC_MSGFILE))) > 0)
+	if (IsDlgButtonChecked(hwndDlg, IDC_USEMSGFILE) && (textLen = GetWindowTextLengthA(GetDlgItem(hwndDlg, IDC_MSGFILE))) > 0)
 	{
 		gConfig.pszMsgFile = (char*)realloc(gConfig.pszMsgFile, textLen + 1);
 		GetDlgItemTextA(hwndDlg, IDC_MSGFILE, gConfig.pszMsgFile, textLen + 1);
@@ -109,6 +117,27 @@ void SaveSettings(HWND hwndDlg, BOOL fWriteFile)
 	{
 		free(gConfig.pszMsgFile); gConfig.pszMsgFile = nullptr;
 	}
+
+	if (IsDlgButtonChecked(hwndDlg, IDC_USELOGFILE) && (textLen = GetWindowTextLengthA(GetDlgItem(hwndDlg, IDC_LOGFILE))) > 0)
+	{
+		gConfig.pszLogFile = (char*)realloc(gConfig.pszLogFile, textLen + 1);
+		GetDlgItemTextA(hwndDlg, IDC_LOGFILE, gConfig.pszLogFile, textLen + 1);
+	}
+	else
+	{
+		free(gConfig.pszLogFile); gConfig.pszLogFile = nullptr;
+	}
+
+	if (IsDlgButtonChecked(hwndDlg, IDC_USEFONTFILE) && (textLen = GetWindowTextLengthA(GetDlgItem(hwndDlg, IDC_FONTFILE))) > 0)
+	{
+		gConfig.pszFontFile = (char*)realloc(gConfig.pszFontFile, textLen + 1);
+		GetDlgItemTextA(hwndDlg, IDC_FONTFILE, gConfig.pszFontFile, textLen + 1);
+	}
+	else
+	{
+		free(gConfig.pszFontFile); gConfig.pszFontFile = nullptr;
+	}
+
 	if ((textLen = GetWindowTextLength(GetDlgItem(hwndDlg, IDC_GAMEPATH))) > 0)
 	{
 		gConfig.pszGamePath = (char*)realloc(gConfig.pszGamePath, textLen + 1);
@@ -121,17 +150,18 @@ void SaveSettings(HWND hwndDlg, BOOL fWriteFile)
 
 	gConfig.fFullScreen = IsDlgButtonChecked(hwndDlg, IDC_FULLSCREEN);
 	gConfig.fUseTouchOverlay = IsDlgButtonChecked(hwndDlg, IDC_TOUCHOVERLAY);
-	gConfig.fUseEmbeddedFonts = IsDlgButtonChecked(hwndDlg, IDC_EMBEDFONT);
 	gConfig.fKeepAspectRatio = IsDlgButtonChecked(hwndDlg, IDC_ASPECTRATIO);
 	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));
+	gConfig.iLogLevel = (LOGLEVEL)(ComboBox_GetCurSel(hwndDlg, IDC_LOGLEVEL));
 	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.iMusicVolume = TrackBar_GetPos(hwndDlg, IDC_MUSICVOLUME);
 	gConfig.iSoundVolume = TrackBar_GetPos(hwndDlg, IDC_SOUNDVOLUME);
 	gConfig.iResampleQuality = TrackBar_GetPos(hwndDlg, IDC_QUALITY);
+
 	if (gConfig.eMusicType == MUSIC_RIX)
 	{
 		gConfig.fUseSurroundOPL = IsDlgButtonChecked(hwndDlg, IDC_SURROUNDOPL);
@@ -149,18 +179,23 @@ void ResetControls(HWND hwndDlg)
 	EnableDlgItem(hwndDlg, IDC_SURROUNDOPL, gConfig.eMusicType == MUSIC_RIX);
 	EnableDlgItem(hwndDlg, IDC_OPLSR, gConfig.eMusicType == MUSIC_RIX);
 
-	CheckRadioButton(hwndDlg, IDC_CHT, IDC_CHS, IDC_CHT + gConfig.uCodePage);
-
 	CheckDlgButton(hwndDlg, IDC_FULLSCREEN, gConfig.fFullScreen);
 	CheckDlgButton(hwndDlg, IDC_TOUCHOVERLAY, gConfig.fUseTouchOverlay);
-	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);
 
+	CheckDlgButton(hwndDlg, IDC_USEMSGFILE, gConfig.pszMsgFile != nullptr);
+	EnableDlgItem(hwndDlg, IDC_BRMSG, gConfig.pszMsgFile != nullptr);
+	CheckDlgButton(hwndDlg, IDC_USEFONTFILE, gConfig.pszFontFile != nullptr);
+	EnableDlgItem(hwndDlg, IDC_BRFONT, gConfig.pszFontFile != nullptr);
+	CheckDlgButton(hwndDlg, IDC_USELOGFILE, gConfig.pszLogFile != nullptr);
+	EnableDlgItem(hwndDlg, IDC_BRLOG, gConfig.pszLogFile != nullptr);
+
 	ComboBox_SetCurSel(hwndDlg, IDC_CD, gConfig.eCDType - MUSIC_MP3);
 	ComboBox_SetCurSel(hwndDlg, IDC_BGM, gConfig.eMusicType);
 	ComboBox_SetCurSel(hwndDlg, IDC_OPL, gConfig.eOPLType);
+	ComboBox_SetCurSel(hwndDlg, IDC_LOGLEVEL, gConfig.iLogLevel);
 
 	SetDlgItemText(hwndDlg, IDC_SAMPLERATE, _itot(gConfig.iSampleRate, buffer, 10));
 	SetDlgItemText(hwndDlg, IDC_OPLSR, _itot(gConfig.iOPLSampleRate, buffer, 10));
@@ -168,6 +203,8 @@ void ResetControls(HWND hwndDlg)
 
 	if (gConfig.pszGamePath) SetDlgItemTextA(hwndDlg, IDC_GAMEPATH, gConfig.pszGamePath);
 	if (gConfig.pszMsgFile) SetDlgItemTextA(hwndDlg, IDC_MSGFILE, gConfig.pszMsgFile);
+	if (gConfig.pszFontFile) SetDlgItemTextA(hwndDlg, IDC_FONTFILE, gConfig.pszFontFile);
+	if (gConfig.pszLogFile) SetDlgItemTextA(hwndDlg, IDC_LOGFILE, gConfig.pszLogFile);
 
 	TrackBar_SetPos(hwndDlg, IDC_QUALITY, gConfig.iResampleQuality, TRUE);
 	TrackBar_SetPos(hwndDlg, IDC_MUSICVOLUME, gConfig.iMusicVolume, TRUE);
@@ -178,6 +215,27 @@ INT_PTR InitProc(HWND hwndDlg, HWND hwndCtrl, LPARAM lParam)
 {
 	InitCommonControls();
 
+	auto log_levels = LoadResourceString(IDC_LOGLEVEL);
+	for (size_t pos = 0; pos != std::string::npos; )
+	{
+		std::wstring item;
+		auto next = log_levels.find(L';', pos);
+		if (next != std::string::npos)
+		{
+			item.assign(log_levels.c_str() + pos, next - pos);
+			pos = next + 1;
+		}
+		else
+		{
+			item.assign(log_levels.c_str() + pos);
+			pos = next;
+		}
+		if (item.length() > 0)
+		{
+			ComboBox_AddString(hwndDlg, IDC_LOGLEVEL, item.c_str());
+		}
+	}
+
 	ComboBox_AddString(hwndDlg, IDC_CD, TEXT("MP3"));
 	ComboBox_AddString(hwndDlg, IDC_CD, TEXT("OGG"));
 
@@ -231,7 +289,7 @@ INT_PTR ButtonProc(HWND hwndDlg, WORD idControl, HWND hwndCtrl)
 	{
 		TCHAR szName[MAX_PATH * 2], szTitle[200];
 		BROWSEINFO bi = { hwndDlg, nullptr, szName, szTitle, BIF_USENEWUI, nullptr, NULL, 0 };
-		LoadStringEx(g_hInstance, idControl, g_wLanguage, szTitle, 200);
+		LoadStringEx(g_hInstance, IDC_BRGAME, g_wLanguage, szTitle, 200);
 		auto pidl = SHBrowseForFolder(&bi);
 		if (pidl)
 		{
@@ -243,6 +301,34 @@ INT_PTR ButtonProc(HWND hwndDlg, WORD idControl, HWND hwndCtrl)
 		return TRUE;
 	}
 
+	case IDC_BRFONT:
+	case IDC_BRMSG:
+	case IDC_BRLOG:
+	{
+		TCHAR szFilePath[MAX_PATH * 2] = { 0 };
+		auto filter = LoadResourceString(idControl + 1);
+		auto title = LoadResourceString(idControl);
+		for (auto i = filter.begin(); i != filter.end(); *i = (*i == '|') ? '\0' : *i, i++);
+		OPENFILENAME ofn = {
+			sizeof(OPENFILENAME), hwndDlg, nullptr,
+			filter.c_str(), nullptr, 0, 0,
+			szFilePath, sizeof(szFilePath) / sizeof(TCHAR),
+			nullptr, 0, nullptr, title.c_str(),
+			OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | (idControl != IDC_BRLOG ? OFN_FILEMUSTEXIST : (DWORD)0)
+		};
+		if (idControl == IDC_BRLOG ? GetSaveFileName(&ofn) : GetOpenFileName(&ofn))
+		{
+			SetDlgItemText(hwndDlg, idControl + 1, ofn.lpstrFile);
+		}
+		return TRUE;
+	}
+
+	case IDC_USEMSGFILE:
+	case IDC_USEFONTFILE:
+	case IDC_USELOGFILE:
+		EnableDlgItem(hwndDlg, idControl + 1, IsDlgButtonChecked(hwndDlg, idControl));
+		return TRUE;
+
 	default: return FALSE;
 	}
 }
@@ -283,19 +369,21 @@ INT_PTR CALLBACK LauncherDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPAR
 	}
 }
 
+typedef LANGID(__stdcall *GETLANGUAGEID)(void);
+
 extern "C" int UTIL_Platform_Init(int argc, char* argv[])
 {
+	// Try to get Vista+ API at runtime, and falls back to XP's API if not found
+	GETLANGUAGEID GetLanguage = (GETLANGUAGEID)GetProcAddress(GetModuleHandle(TEXT("Kernel32.dll")), "GetThreadUILanguage");
+	if (!GetLanguage) GetLanguage = GetUserDefaultLangID;
+
 	// Defaults log to debug output
 	UTIL_LogAddOutputCallback([](LOGLEVEL, const char* str, const char*)->void {
 		OutputDebugStringA(str);
 	}, PAL_DEFAULT_LOGLEVEL);
 
 	g_hInstance = GetModuleHandle(nullptr);
-#if !defined(__MINGW32__) || _WIN32_WINNT > _WIN32_WINNT_WS03 // compile time switch; use `make CCFLAGS=-D_WIN32_WINNT=_WIN32_WINNT_VISTA` for vista+ only automatic language detection
-	g_wLanguage = GetThreadUILanguage();
-#else // default XP compatible CodePage detection hack.
-	g_wLanguage = GetSystemDefaultLangID();
-#endif
+	g_wLanguage = GetLanguage();
 	if (PRIMARYLANGID(g_wLanguage) == LANG_CHINESE)
 	{
 		if (SUBLANGID(g_wLanguage) == SUBLANG_CHINESE_SIMPLIFIED || SUBLANGID(g_wLanguage) == SUBLANG_CHINESE_SINGAPORE)