#include #include "Resource.h" #include #include //--------------------------------------------------------------------------- using namespace std; HWND hWnd; string stAppDirectory; char * Resolutions[4] = {"640 x 480 x 32", "800 x 600 x 32", "1024 x 768 x 32", "1280 x 1024 x 32"}; char * AAValues[6] = {"0", "2", "4", "6", "8", "16"}; char * AFValues[6] = {"1", "2", "4", "6", "8", "16"}; int AAValuesI[6] = {0, 2, 4, 6, 8, 16}; int AFValuesI[6] = {1, 2, 4, 6, 8, 16}; typedef struct{ char FLangName[20]; bool FMusicEnabled; bool FVSyncEnabled; bool FWindowed; int FSamples; // anti-alias samples int FScreenResolution; int FAnisotropicFilter; //anisotropic filtering }TGameOptions; TGameOptions FGameOptions; vector FLangFiles; LRESULT CALLBACK DlgProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); //--------------------------------------------------------------------------- INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { DialogBox(hInstance, MAKEINTRESOURCE(IDD_DLGFIRST), hWnd, reinterpret_cast(DlgProc)); return FALSE; } //--------------------------------------------------------------------------- void SaveSettings(HWND hWndDlg) { HKEY hk; if (RegCreateKeyEx(HKEY_CURRENT_USER, "SOFTWARE\\Soko3D", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hk, 0)) { // MessageBox (HWND_DESKTOP, "Could not create the registry key", "Error", // MB_OK | MB_ICONEXCLAMATION); } DWORD dwData; HWND AWnd; AWnd = GetDlgItem(hWndDlg, IDC_LANGUAGE); SendMessage(AWnd, CB_GETLBTEXT, 0, (LPARAM)&FGameOptions.FLangName); AWnd = GetDlgItem(hWndDlg, IDCH_MUSIC); FGameOptions.FMusicEnabled = SendMessage(AWnd, BM_GETCHECK, 0, 0) == BST_CHECKED; AWnd = GetDlgItem(hWndDlg, IDCH_FULLSCREEN); FGameOptions.FWindowed = SendMessage(AWnd, BM_GETCHECK, 0, 0) == BST_UNCHECKED; AWnd = GetDlgItem(hWndDlg, IDCH_VSYNC); FGameOptions.FVSyncEnabled = SendMessage(AWnd, BM_GETCHECK, 0, 0) == BST_CHECKED; AWnd = GetDlgItem(hWndDlg, IDC_AA); FGameOptions.FSamples = AAValuesI[SendMessage(AWnd, CB_GETCURSEL, 0, 0)]; AWnd = GetDlgItem(hWndDlg, IDC_AF); FGameOptions.FAnisotropicFilter = AFValuesI[SendMessage(AWnd, CB_GETCURSEL, 0, 0)]; // SendMessage(AWnd, CB_GETLBTEXT, 0, (LPARAM)&FGameOptions.FAnisotropicFilter); AWnd = GetDlgItem(hWndDlg, IDC_RESOLUTION); FGameOptions.FScreenResolution = SendMessage(AWnd, CB_GETCURSEL, 0, 0); //FGameOptions.FMusicEnabled BM_GETCHECK RegSetValueEx(hk, "Language", 0, REG_SZ, // (LPBYTE)&FGameOptions.FLangName, sizeof(FGameOptions.FLangName)); (LPBYTE)&FGameOptions.FLangName, sizeof(FGameOptions.FLangName)); dwData = DWORD(FGameOptions.FMusicEnabled); RegSetValueEx(hk, "Music", 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); dwData = DWORD(FGameOptions.FSamples); RegSetValueEx(hk, "Samples", 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); dwData = DWORD(FGameOptions.FVSyncEnabled); RegSetValueEx(hk, "VSync", 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); dwData = DWORD(FGameOptions.FAnisotropicFilter); RegSetValueEx(hk, "Anisotropic filtering", 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); dwData = DWORD(FGameOptions.FWindowed); RegSetValueEx(hk, "Windowed", 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); dwData = DWORD(FGameOptions.FScreenResolution); RegSetValueEx(hk, "Resolution", 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); RegCloseKey(hk); } void LoadSettings(void) { HKEY hk; // changed to CURRENT_USER to allow guests on computer to configure if (RegCreateKeyEx(HKEY_CURRENT_USER, "SOFTWARE\\Soko3D", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hk, 0)) { // MessageBox (HWND_DESKTOP, "Could not create the registry key", "Error", // MB_OK | MB_ICONEXCLAMATION); } DWORD dwData; strcpy(FGameOptions.FLangName, "English.txt"); // dwData = strlen(FGameOptions.FLangName);// sizeof(FGameOptions.FLangName); // DWORD MusicEn = 1; dwData = sizeof(FGameOptions.FLangName); RegQueryValueEx(hk, "Language", 0, NULL, (LPBYTE)&FGameOptions.FLangName, &dwData); FGameOptions.FMusicEnabled = true; dwData = sizeof(DWORD); DWORD MusicEn = 1; RegQueryValueEx(hk, "Music", 0, 0, (LPBYTE)&MusicEn, &dwData); FGameOptions.FMusicEnabled = (bool)MusicEn; FGameOptions.FSamples = 0; dwData = sizeof(DWORD); DWORD dwSamples = 0; RegQueryValueEx(hk, "Samples", 0, 0, (LPBYTE)&dwSamples, &dwData); FGameOptions.FSamples = dwSamples; FGameOptions.FWindowed = false; dwData = sizeof(DWORD); DWORD dwWindowed = 0; RegQueryValueEx(hk, "Windowed", 0, 0, (LPBYTE)&dwWindowed, &dwData); FGameOptions.FWindowed = (bool)dwWindowed; FGameOptions.FAnisotropicFilter = 1; dwData = sizeof(DWORD); DWORD dwFilter = 1; RegQueryValueEx(hk, "Anisotropic filtering", 0, 0, (LPBYTE)&dwFilter, &dwData); FGameOptions.FAnisotropicFilter = dwFilter; FGameOptions.FScreenResolution = 1; // 800 * 600 standard dwData = sizeof(DWORD); DWORD dwRes = 1; RegQueryValueEx(hk, "Resolution", 0, 0, (LPBYTE)&dwRes, &dwData); FGameOptions.FScreenResolution = dwRes; FGameOptions.FVSyncEnabled = true; dwData = sizeof(DWORD); DWORD VSyncEn = DWORD(FGameOptions.FVSyncEnabled); RegQueryValueEx(hk, "VSync", 0, 0, (LPBYTE)&VSyncEn, &dwData); FGameOptions.FVSyncEnabled = (bool)VSyncEn; RegCloseKey(hk); } void EnumerateDir(string folderpath, vector & outputfolderlist) { //------Folder listing code for POSIX #ifndef _WIN32 DIR *dp; struct dirent *ep; dp = opendir (folderpath.c_str()); if (dp != NULL) { while ( ( ep = readdir( dp ) ) ) { //puts (ep->d_name); string newname = ep->d_name; if (newname != "." && newname != "..") { outputfolderlist.push_back(newname); } } (void) closedir (dp); } else return; #else //------End POSIX-specific folder listing code ---- Start WIN32 Specific code HANDLE hList; TCHAR szDir[MAX_PATH+1]; WIN32_FIND_DATA FileData; // Get the proper directory path sprintf(szDir, "%s*", folderpath.c_str ()); // Get the first file hList = FindFirstFile(szDir, &FileData); if (hList == INVALID_HANDLE_VALUE) { //outputfolderlist.resize(0); } else { // Traverse through the directory structure while (FindNextFile(hList, &FileData)) { // Check the object is a directory or not if (FileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) {} else { if ((strcmp(FileData.cFileName, ".") != 0) && (strcmp(FileData.cFileName, "..") != 0)) { outputfolderlist.push_back (FileData.cFileName); } } } } FindClose(hList); #endif //------End WIN32 specific folder listing code // outputfolderlist.sort(); // return true; } char* ExtractFilePath(void) { char fullpath[MAX_PATH]; GetModuleFileName(NULL, fullpath, sizeof(fullpath)); DWORD dwSize; LPSTR szDirectory; dwSize = strrchr(fullpath, '\\') - fullpath + 2; szDirectory = (LPSTR) malloc(dwSize); lstrcpynA(szDirectory, fullpath, dwSize); return szDirectory; } LRESULT CALLBACK DlgProc(HWND hWndDlg, UINT Msg, WPARAM wParam, LPARAM lParam) { switch(Msg) { case WM_INITDIALOG: { stAppDirectory = ExtractFilePath(); HWND AWnd; AWnd = GetDlgItem(hWndDlg, IDC_LANGUAGE); EnumerateDir(stAppDirectory + "Data/languages/", FLangFiles); for (int i = 0; i < FLangFiles.size(); i++) SendMessage(AWnd, CB_ADDSTRING, 0, (LPARAM)FLangFiles[i].c_str()); LoadSettings(); SendMessage(AWnd, CB_SELECTSTRING, 0, (LPARAM)FGameOptions.FLangName); // SendMessage(AWnd, CB_SETMINVISIBLE, 8, 0); // SendMessage(AWnd, CB_ADDSTRING, 0, (LPARAM)lol); // SendMessage(AWnd, CB_ADDSTRING, 0, (LPARAM)hey); AWnd = GetDlgItem(hWndDlg, IDC_RESOLUTION); SendMessage(AWnd, CB_ADDSTRING, 0, (LPARAM)Resolutions[0]); SendMessage(AWnd, CB_ADDSTRING, 0, (LPARAM)Resolutions[1]); SendMessage(AWnd, CB_ADDSTRING, 0, (LPARAM)Resolutions[2]); SendMessage(AWnd, CB_ADDSTRING, 0, (LPARAM)Resolutions[3]); SendMessage(AWnd, CB_SETCURSEL, (WPARAM)FGameOptions.FScreenResolution, 0); AWnd = GetDlgItem(hWndDlg, IDC_AA); SendMessage(AWnd, CB_ADDSTRING, 0, (LPARAM)AAValues[0]); SendMessage(AWnd, CB_ADDSTRING, 0, (LPARAM)AAValues[1]); SendMessage(AWnd, CB_ADDSTRING, 0, (LPARAM)AAValues[2]); SendMessage(AWnd, CB_ADDSTRING, 0, (LPARAM)AAValues[3]); SendMessage(AWnd, CB_ADDSTRING, 0, (LPARAM)AAValues[4]); SendMessage(AWnd, CB_ADDSTRING, 0, (LPARAM)AAValues[5]); char samples[2]; sprintf(samples, "%d", FGameOptions.FSamples); SendMessage(AWnd, CB_SELECTSTRING, 0, (LPARAM)samples); AWnd = GetDlgItem(hWndDlg, IDC_AF); SendMessage(AWnd, CB_ADDSTRING, 0, (LPARAM)AFValues[0]); SendMessage(AWnd, CB_ADDSTRING, 0, (LPARAM)AFValues[1]); SendMessage(AWnd, CB_ADDSTRING, 0, (LPARAM)AFValues[2]); SendMessage(AWnd, CB_ADDSTRING, 0, (LPARAM)AFValues[3]); SendMessage(AWnd, CB_ADDSTRING, 0, (LPARAM)AFValues[4]); SendMessage(AWnd, CB_ADDSTRING, 0, (LPARAM)AFValues[5]); char af[2]; sprintf(af, "%d", FGameOptions.FAnisotropicFilter); SendMessage(AWnd, CB_SELECTSTRING, 0, (LPARAM)af); if (FGameOptions.FMusicEnabled) SendDlgItemMessage(hWndDlg, IDCH_MUSIC, BM_SETCHECK, BST_CHECKED, 0); else SendDlgItemMessage(hWndDlg, IDCH_MUSIC, BM_SETCHECK, BST_UNCHECKED, 0); if (FGameOptions.FVSyncEnabled) SendDlgItemMessage(hWndDlg, IDCH_VSYNC, BM_SETCHECK, BST_CHECKED, 0); else SendDlgItemMessage(hWndDlg, IDCH_VSYNC, BM_SETCHECK, BST_UNCHECKED, 0); if (!FGameOptions.FWindowed) SendDlgItemMessage(hWndDlg, IDCH_FULLSCREEN, BM_SETCHECK, BST_CHECKED, 0); else SendDlgItemMessage(hWndDlg, IDCH_FULLSCREEN, BM_SETCHECK, BST_UNCHECKED, 0); return TRUE; } case WM_CLOSE: { EndDialog(hWndDlg, IDCANCEL); return TRUE; } case WM_COMMAND: switch(wParam) { case IDCANCEL: { EndDialog(hWndDlg, 0); return TRUE; } case IDOK: { SaveSettings(hWndDlg); // save the settings EndDialog(hWndDlg, 0); return TRUE; } // return TRUE; } break; } return FALSE; } //---------------------------------------------------------------------------