BOOL CALLBACK PreferencesDialogProc(HWND hDlg, UINT message, UINT wParam, LONG lParam) { static HWND hBrowser; static Bool browser_changed; Bool toolbar_changed, lagbox_changed, temp; CommSettings *comm = &config.comm; OPENFILENAME ofn; static char *dir; // Working directory before dialog (OpenFile may change it) int new_val; switch (message) { case WM_INITDIALOG: CenterWindow(hDlg, GetParent(hDlg)); if (hPreferencesDialog != NULL) { EndDialog(hDlg, IDCANCEL); return FALSE; } hPreferencesDialog = hDlg; hBrowser = GetDlgItem(hDlg, IDC_BROWSER); Edit_LimitText(hBrowser, MAX_PATH); SetWindowFont(hBrowser, GetFont(FONT_INPUT), FALSE); SetWindowText(hBrowser, config.browser); CheckDlgButton(hDlg, IDC_SCROLLLOCK, config.scroll_lock); CheckDlgButton(hDlg, IDC_DRAWNAMES, config.draw_names); CheckDlgButton(hDlg, IDC_TOOLTIPS, config.tooltips); CheckDlgButton(hDlg, IDC_PAIN, config.pain); CheckDlgButton(hDlg, IDC_INVNUM, config.inventory_num); CheckDlgButton(hDlg, IDC_SAFETY, config.aggressive); CheckDlgButton(hDlg, IDC_BOUNCE, config.bounce); CheckDlgButton(hDlg, IDC_TOOLBAR, config.toolbar); CheckDlgButton(hDlg, IDS_LATENCY0, config.lagbox); CheckDlgButton(hDlg, IDC_PROFANE, config.antiprofane); CheckDlgButton(hDlg, IDC_DRAWMAP, config.drawmap); CheckDlgButton(hDlg, IDC_MAP_ANNOTATIONS, config.map_annotations); CheckDlgButton(hDlg, IDC_MUSIC, config.play_music); CheckDlgButton(hDlg, IDC_SOUNDFX, config.play_sound); CheckDlgButton(hDlg, IDC_LOOPSOUNDS, config.play_loop_sounds); CheckDlgButton(hDlg, IDC_RANDSOUNDS, config.play_random_sounds); EnableWindow(GetDlgItem(hDlg, IDC_LOOPSOUNDS), IsDlgButtonChecked(hDlg, IDC_SOUNDFX)); EnableWindow(GetDlgItem(hDlg, IDC_RANDSOUNDS), IsDlgButtonChecked(hDlg, IDC_SOUNDFX)); CheckRadioButton(hDlg, IDC_TARGETHALO1, IDC_TARGETHALO3, config.halocolor + IDC_TARGETHALO1); CheckDlgButton(hDlg, IDC_COLORCODES, config.colorcodes); Trackbar_SetRange(GetDlgItem(hDlg, IDC_SOUND_VOLUME), 0, CONFIG_MAX_VOLUME, FALSE); Trackbar_SetRange(GetDlgItem(hDlg, IDC_MUSIC_VOLUME), 0, CONFIG_MAX_VOLUME, FALSE); Trackbar_SetPos(GetDlgItem(hDlg, IDC_SOUND_VOLUME), config.sound_volume); Trackbar_SetPos(GetDlgItem(hDlg, IDC_MUSIC_VOLUME), config.music_volume); dir = (char *) SafeMalloc(MAX_PATH + 1); GetWorkingDirectory(dir, MAX_PATH); browser_changed = False; return TRUE; case WM_COMMAND: switch(GET_WM_COMMAND_ID(wParam, lParam)) { case IDC_BROWSER: if (GET_WM_COMMAND_CMD(wParam, lParam) != EN_CHANGE) break; browser_changed = True; return TRUE; case IDC_FIND: memset(&ofn, 0, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hDlg; ofn.lpstrFilter = EXE_filter; ofn.lpstrFile = config.browser; ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; if (GetOpenFileName(&ofn)) { SetWindowText(hBrowser, config.browser); browser_changed = True; } else debug(("GetOpenFileName failed, error = %d\n", CommDlgExtendedError())); return TRUE; case IDCANCEL: EndDialog(hDlg, IDCANCEL); return TRUE; case IDC_SOUNDFX: EnableWindow(GetDlgItem(hDlg, IDC_LOOPSOUNDS), IsDlgButtonChecked(hDlg, IDC_SOUNDFX)); EnableWindow(GetDlgItem(hDlg, IDC_RANDSOUNDS), IsDlgButtonChecked(hDlg, IDC_SOUNDFX)); return TRUE; case IDC_PROFANESETTINGS: if (IDOK == DialogBox(hInst, MAKEINTRESOURCE(IDC_PROFANESETTINGS), hDlg, ProfanityDialogProc)) CheckDlgButton(hDlg, IDC_PROFANE, TRUE); return TRUE; case IDOK: Edit_GetText(hBrowser, config.browser, MAX_PATH); if (browser_changed) config.default_browser = False; config.scroll_lock = IsDlgButtonChecked(hDlg, IDC_SCROLLLOCK); config.draw_names = IsDlgButtonChecked(hDlg, IDC_DRAWNAMES); config.tooltips = IsDlgButtonChecked(hDlg, IDC_TOOLTIPS); config.pain = IsDlgButtonChecked(hDlg, IDC_PAIN); config.inventory_num = IsDlgButtonChecked(hDlg, IDC_INVNUM); config.aggressive = IsDlgButtonChecked(hDlg, IDC_SAFETY); config.bounce = IsDlgButtonChecked(hDlg, IDC_BOUNCE); config.antiprofane = IsDlgButtonChecked(hDlg, IDC_PROFANE); config.drawmap = IsDlgButtonChecked(hDlg, IDC_DRAWMAP); config.map_annotations = IsDlgButtonChecked(hDlg, IDC_MAP_ANNOTATIONS); temp = IsDlgButtonChecked(hDlg, IDC_TOOLBAR); toolbar_changed = (temp != config.toolbar); config.toolbar = temp; temp = IsDlgButtonChecked(hDlg, IDS_LATENCY0); lagbox_changed = (temp != config.lagbox); config.lagbox = temp; if (IsDlgButtonChecked(hDlg, IDC_MUSIC) != config.play_music) UserToggleMusic(config.play_music); config.play_music = IsDlgButtonChecked(hDlg, IDC_MUSIC); config.play_sound = IsDlgButtonChecked(hDlg, IDC_SOUNDFX); config.play_loop_sounds = IsDlgButtonChecked(hDlg, IDC_LOOPSOUNDS); config.play_random_sounds = IsDlgButtonChecked(hDlg, IDC_RANDSOUNDS); if (!config.play_sound) SoundAbort(); new_val = Trackbar_GetPos(GetDlgItem(hDlg, IDC_MUSIC_VOLUME)); if (new_val != config.music_volume) { config.music_volume = new_val; ResetMusicVolume(); } // Don't need to dynamically update sound volume, because // looping sounds are updated as player moves around. config.sound_volume = Trackbar_GetPos(GetDlgItem(hDlg, IDC_SOUND_VOLUME)); if( IsDlgButtonChecked( hDlg, IDC_TARGETHALO1 ) == BST_CHECKED ) config.halocolor = 0; else if( IsDlgButtonChecked( hDlg, IDC_TARGETHALO2 ) == BST_CHECKED ) config.halocolor = 1; else config.halocolor = 2; config.colorcodes = IsDlgButtonChecked(hDlg, IDC_COLORCODES); // Redraw main window to reflect new settings if (toolbar_changed || lagbox_changed) { ResizeAll(); } else { InvalidateRect(hMain, NULL, TRUE); RedrawAll(); } EditBoxSetNormalFormat(); EndDialog(hDlg, IDOK); return TRUE; } break; case WM_DESTROY: // Restore working drive and directory if (chdir(dir) != 0) debug(("chdir failed to %s\n", dir)); SafeFree(dir); hPreferencesDialog = NULL; return TRUE; } return FALSE; }
/* * MenuCommand: A menu item has been selected. */ void MenuCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) { // Set last action time to now, to prevent keypress from being interpreted as a game action. KeySetLastNorepeatTime(); // See if module wants to handle menu selection if (ModuleEvent(EVENT_MENUITEM, id) == False) return; /* Handle menu selections */ switch (id) { case ID_GAME_EXIT: if (connection != CON_NONE && !AreYouSure(hInst, hMain, NO_BUTTON, IDS_LOGOFF)) break; MainQuit(hwnd); break; case ID_GAME_PRINTMAP: if (state == STATE_GAME) PrintMap(FALSE); break; case ID_GAME_CONNECT: OfflineConnect(); break; case ID_GAME_DISCONNECT: if (!AreYouSure(hInst, hMain, NO_BUTTON, IDS_LOGOFF)) break; Logoff(); MainSetState(STATE_OFFLINE); break; case ID_GAME_SETTINGS: if (DialogBox(hInst, MAKEINTRESOURCE(IDD_SETTINGS), hMain, PreferencesDialogProc) == IDOK) { ModuleEvent(EVENT_CONFIGCHANGED); MenuDisplaySettings(hMain); } break; case ID_CONFIGMENU: ConfigMenuLaunch(); break; case ID_GAME_PASSWORD: PerformAction(A_CHANGEPASSWORD, NULL); break; case ID_OPTIONS_TIMEOUT: UserSetTimeout(); break; case ID_OPTIONS_MUSIC: config.play_music = !config.play_music; CheckMenuItem(menu, ID_OPTIONS_MUSIC, config.play_music ? MF_CHECKED : MF_UNCHECKED); UserToggleMusic(config.play_music); break; case ID_OPTIONS_SOUND: config.play_sound = !config.play_sound; CheckMenuItem(menu, ID_OPTIONS_SOUND, config.play_sound ? MF_CHECKED : MF_UNCHECKED); if (!config.play_sound) SoundStopAll(); break; case ID_OPTIONS_SAVENOW: SaveSettings(); break; case ID_OPTIONS_SAVEEXIT: config.save_settings = !config.save_settings; CheckMenuItem(menu, ID_OPTIONS_SAVEEXIT, config.save_settings ? MF_CHECKED : MF_UNCHECKED); break; case ID_OPTIONS_AREA: // due to issues with certain D3D drivers, this no longer immediately updates the config // it now sets a temporary variable that will update the config on shutdown // this means a shutdown and restart are necessary for window size changes MessageBox(hMain, "You must shutdown and restart Meridian 59 for these changes to take effect", "Direct3D", MB_OK); // config.large_area = !config.large_area; gLargeArea = !gLargeArea; CheckMenuItem(menu, ID_OPTIONS_AREA, gLargeArea ? MF_CHECKED : MF_UNCHECKED); /* if (state == STATE_GAME) // Send ourselves a resize message ResizeAll(); RedrawAll();*/ break; case ID_OPTIONS_FONT_MAP_TITLE: UserSelectFont(FONT_MAP_TITLE); break; case ID_OPTIONS_FONT_MAP_LABEL: UserSelectFont(FONT_MAP_LABEL); break; case ID_OPTIONS_FONT_MAP_TEXT: UserSelectFont(FONT_MAP_TEXT); break; case ID_FONT_GAMETEXT: UserSelectFont(FONT_EDIT); break; case ID_FONT_LIST: UserSelectFont(FONT_LIST); break; case ID_FONT_MAIL: UserSelectFont(FONT_MAIL); break; case ID_FONT_TITLES: UserSelectFont(FONT_TITLES); break; case ID_FONT_STATISTICS: UserSelectFont(FONT_STATS); break; case ID_FONT_INPUT: UserSelectFont(FONT_INPUT); break; case ID_FONT_LABELS: UserSelectFont(FONT_LABELS); break; case ID_FONT_DEFAULTS: FontsRestoreDefaults(); break; case ID_COLOR_MAIN: UserSelectColors(COLOR_FGD, COLOR_BGD); break; case ID_COLOR_LIST: UserSelectColors(COLOR_LISTFGD, COLOR_LISTBGD); break; case ID_COLOR_LISTSEL: UserSelectColors(COLOR_LISTSELFGD, COLOR_LISTSELBGD); break; case ID_COLOR_MAGIC: UserSelectColor(COLOR_ITEM_MAGIC_FG); break; case ID_COLOR_HIGHLIGHT: UserSelectColor(COLOR_HIGHLITE); break; case ID_COLOR_MAIL: UserSelectColors(COLOR_MAILFGD, COLOR_MAILBGD); break; case ID_COLOR_TEXT: UserSelectColors(COLOR_MAINEDITFGD, COLOR_MAINEDITBGD); break; case ID_COLOR_EDIT: UserSelectColors(COLOR_EDITFGD, COLOR_EDITBGD); break; case ID_COLOR_SYSMSG: UserSelectColor(COLOR_SYSMSGFGD); case ID_COLOR_QUESTHEADER: UserSelectColor(COLOR_QUEST_HEADER); break; break; case ID_COLOR_STATS: UserSelectColors(COLOR_STATSFGD, COLOR_STATSBGD); break; case ID_COLOR_BAR1: UserSelectColor(COLOR_BAR1); break; case ID_COLOR_BAR2: UserSelectColor(COLOR_BAR2); break; case ID_COLOR_BAR3: UserSelectColor(COLOR_BAR3); break; case ID_COLOR_BAR4: UserSelectColor(COLOR_BAR4); break; case ID_COLOR_INVNUM: UserSelectColors(COLOR_INVNUMFGD, COLOR_INVNUMBGD); break; case ID_COLOR_DEFAULTS: ColorsRestoreDefaults(); break; case ID_HELP_CONTENTS: StartHelp(); break; case ID_HOMEPAGE: WebLaunchBrowser(GetString(hInst, IDS_HOMEPAGEURL)); break; case ID_FORUM: WebLaunchBrowser(GetString(hInst, IDS_FORUMURL)); break; case ID_WIKI: WebLaunchBrowser(GetString(hInst, IDS_WIKIURL)); break; case ID_HELP_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUT), hMain, AboutDialogProc); break; } }