From 3d2e59ecec49db8036296667ca29437898304308 Mon Sep 17 00:00:00 2001 From: Bart House Date: Sat, 14 Oct 2017 18:19:24 -0700 Subject: [PATCH] Win32GUI: Changes to player selection dialog. Significant changes to player selection dialog that attempt to match recently made changes to the Qt and X11 window ports. --- win/win32/mhdlg.c | 874 +++++++++++++++++++++---------------------- win/win32/mhdlg.h | 2 +- win/win32/mswproc.c | 4 +- win/win32/resource.h | 290 +++++++------- win/win32/winMS.h | 1 + win/win32/winhack.rc | 168 +++++---- 6 files changed, 662 insertions(+), 677 deletions(-) diff --git a/win/win32/mhdlg.c b/win/win32/mhdlg.c index efd35dff8..a91eecf20 100644 --- a/win/win32/mhdlg.c +++ b/win/win32/mhdlg.c @@ -10,6 +10,8 @@ #include "resource.h" #include "mhdlg.h" +#include + /*---------------------------------------------------------------*/ /* data for getlin dialog */ struct getlin_data { @@ -256,34 +258,51 @@ ExtCmdDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } /*---------------------------------------------------------------*/ -/* player selector dialog data */ -struct plsel_data { - int *selection; -}; +/* player selector dialog */ +typedef struct plsel_data { + int config_race; + int config_role; + int config_gender; + int config_alignment; + HWND control_role; + HWND control_race; + HWND control_genders[ROLE_GENDERS]; + HWND control_aligns[ROLE_ALIGNS]; + int role_count; + int race_count; + HWND focus; +} plsel_data_t; INT_PTR CALLBACK PlayerSelectorDlgProc(HWND, UINT, WPARAM, LPARAM); static void plselInitDialog(HWND hWnd); -static void plselAdjustLists(HWND hWnd, int changed_opt); -static int plselFinalSelection(HWND hWnd, int *selection); +static void plselAdjustSelections(HWND hWnd); +static boolean plselRandomize(plsel_data_t * data); +static BOOL plselDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam); -int -mswin_player_selection_window(int *selection) +boolean +mswin_player_selection_window() { INT_PTR ret; - struct plsel_data data; + plsel_data_t data; + boolean ok = TRUE; - /* init dialog data */ - ZeroMemory(&data, sizeof(data)); - data.selection = selection; + /* save away configuration settings */ + data.config_role = flags.initrole; + data.config_race = flags.initrace; + data.config_gender = flags.initgend; + data.config_alignment = flags.initalign; - /* create modal dialog */ - ret = DialogBoxParam( - GetNHApp()->hApp, MAKEINTRESOURCE(IDD_PLAYER_SELECTOR), - GetNHApp()->hMainWnd, PlayerSelectorDlgProc, (LPARAM) &data); - if (ret == -1) - panic("Cannot create getlin window"); + if (!plselRandomize(&data)) { + /* create modal dialog */ + ret = DialogBoxParam( + GetNHApp()->hApp, MAKEINTRESOURCE(IDD_PLAYER_SELECTOR), + GetNHApp()->hMainWnd, PlayerSelectorDlgProc, (LPARAM) &data); + if (ret == -1) + panic("Cannot create getlin window"); + ok = (ret == IDOK); + } - return (int) ret; + return ok; } INT_PTR CALLBACK @@ -315,11 +334,94 @@ PlayerSelectorDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) /* init dialog */ plselInitDialog(hWnd); - /* set focus on the role checkbox (random) field */ - SetFocus(GetDlgItem(hWnd, IDC_PLSEL_ROLE_RANDOM)); + /* tell windows to set the focus */ + return TRUE; + break; - /* tell windows we set the focus */ - return FALSE; + case WM_DRAWITEM: + if (wParam == IDC_PLSEL_ROLE_LIST || wParam == IDC_PLSEL_RACE_LIST) + return plselDrawItem(hWnd, wParam, lParam); + break; + + case WM_NOTIFY: + { + LPNMHDR nmhdr = (LPNMHDR)lParam; + HWND control = nmhdr->hwndFrom; + + data = (struct plsel_data *) GetWindowLongPtr(hWnd, GWLP_USERDATA); + + switch (nmhdr->code) { + case LVN_KEYDOWN: + { + LPNMLVKEYDOWN lpnmkeydown = (LPNMLVKEYDOWN) lParam; + + if (lpnmkeydown->wVKey == ' ') { + if (control == data->control_role) { + int i = ListView_GetNextItem(data->control_role, -1, LVNI_FOCUSED); + assert(i == -1 || ListView_GetNextItem(data->control_role, i, LVNI_FOCUSED) == -1); + flags.initrole = i; + plselAdjustSelections(hWnd); + } else if (control == data->control_race) { + int i = ListView_GetNextItem(data->control_race, -1, LVNI_FOCUSED); + assert(i == -1 || ListView_GetNextItem(data->control_race, i, LVNI_FOCUSED) == -1); + if (ok_race(flags.initrole, i, ROLE_RANDOM, ROLE_RANDOM)) { + flags.initrace = i; + plselAdjustSelections(hWnd); + } + } + } + } + break; + case NM_CLICK: + { + LPNMLISTVIEW lpnmitem = (LPNMLISTVIEW)lParam; + int i = lpnmitem->iItem; + if (i == -1) + return FALSE; + if (control == data->control_role) { + flags.initrole = i; + plselAdjustSelections(hWnd); + } else if(control == data->control_race) { + if (ok_race(flags.initrole, i, ROLE_RANDOM, ROLE_RANDOM)) { + flags.initrace = i; + plselAdjustSelections(hWnd); + } + } + } + break; + case NM_KILLFOCUS: + { + char buf[64]; + sprintf(buf, "KILLFOCUS %lx\n", (unsigned long) control); + OutputDebugStringA(buf); + + if (data->focus == data->control_race) { + data->focus = NULL; + ListView_RedrawItems(data->control_race, 0, data->race_count - 1); + } else if (data->focus == data->control_role) { + data->focus = NULL; + ListView_RedrawItems(data->control_role, 0, data->role_count - 1); + } + } + break; + case NM_SETFOCUS: + { + char buf[64]; + sprintf(buf, "SETFOCUS %lx\n", (unsigned long) control); + OutputDebugStringA(buf); + data->focus = control; + + if (control == data->control_race) { + data->focus = data->control_race; + plselAdjustSelections(hWnd); + } else if (control == data->control_role) { + data->focus = data->control_role; + plselAdjustSelections(hWnd); + } + } + break; + } + } break; case WM_COMMAND: @@ -327,483 +429,361 @@ PlayerSelectorDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) switch (LOWORD(wParam)) { /* OK button was clicked */ case IDOK: - if (plselFinalSelection(hWnd, data->selection)) { - EndDialog(hWnd, wParam); - } else { - NHMessageBox( - hWnd, TEXT("Cannot match this role. Try something else."), - MB_ICONSTOP | MB_OK); - } + EndDialog(hWnd, wParam); return TRUE; /* CANCEL button was clicked */ case IDCANCEL: - *data->selection = -1; EndDialog(hWnd, wParam); return TRUE; - /* following are events from dialog controls: - "random" checkboxes send BN_CLICKED messages; - role/race/... combo-boxes send CBN_SELENDOK - if something was selected; - */ - case IDC_PLSEL_ROLE_RANDOM: + case IDC_PLSEL_RANDOM: + plselRandomize(data); + plselAdjustSelections(hWnd); + return TRUE; + + case IDC_PLSEL_GENDER_MALE: + case IDC_PLSEL_GENDER_FEMALE: if (HIWORD(wParam) == BN_CLICKED) { - /* enable corresponding list window if "random" - checkbox was "unchecked" */ - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ROLE_LIST), - SendMessage((HWND) lParam, BM_GETCHECK, 0, 0) - == BST_UNCHECKED); + int i = LOWORD(wParam) - IDC_PLSEL_GENDER_MALE; + if (ok_gend(flags.initrole, flags.initrace, i, ROLE_RANDOM)) { + flags.initgend = i; + plselAdjustSelections(hWnd); + } } break; - case IDC_PLSEL_RACE_RANDOM: + + case IDC_PLSEL_ALIGN_LAWFUL: + case IDC_PLSEL_ALIGN_NEUTRAL: + case IDC_PLSEL_ALIGN_CHAOTIC: if (HIWORD(wParam) == BN_CLICKED) { - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_RACE_LIST), - SendMessage((HWND) lParam, BM_GETCHECK, 0, 0) - == BST_UNCHECKED); + int i = LOWORD(wParam) - IDC_PLSEL_ALIGN_LAWFUL; + if (ok_align(flags.initrole, flags.initrace, flags.initgend, i)) { + flags.initalign = i; + plselAdjustSelections(hWnd); + } } break; - case IDC_PLSEL_GENDER_RANDOM: - if (HIWORD(wParam) == BN_CLICKED) { - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_GENDER_LIST), - SendMessage((HWND) lParam, BM_GETCHECK, 0, 0) - == BST_UNCHECKED); - } - break; - - case IDC_PLSEL_ALIGN_RANDOM: - if (HIWORD(wParam) == BN_CLICKED) { - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ALIGN_LIST), - SendMessage((HWND) lParam, BM_GETCHECK, 0, 0) - == BST_UNCHECKED); - } - break; - - case IDC_PLSEL_ROLE_LIST: - if (HIWORD(wParam) == CBN_SELENDOK) { - /* filter out invalid options if - the selection was made */ - plselAdjustLists(hWnd, LOWORD(wParam)); - } - break; - - case IDC_PLSEL_RACE_LIST: - if (HIWORD(wParam) == CBN_SELENDOK) { - plselAdjustLists(hWnd, LOWORD(wParam)); - } - break; - - case IDC_PLSEL_GENDER_LIST: - if (HIWORD(wParam) == CBN_SELENDOK) { - plselAdjustLists(hWnd, LOWORD(wParam)); - } - break; - - case IDC_PLSEL_ALIGN_LIST: - if (HIWORD(wParam) == CBN_SELENDOK) { - plselAdjustLists(hWnd, LOWORD(wParam)); - } - break; } break; } return FALSE; } -void -setComboBoxValue(HWND hWnd, int combo_box, int value) -{ - int index_max = - (int) SendDlgItemMessage(hWnd, combo_box, CB_GETCOUNT, 0, 0); - int index; - int value_to_set = LB_ERR; - for (index = 0; index < index_max; index++) { - if (SendDlgItemMessage(hWnd, combo_box, CB_GETITEMDATA, - (WPARAM) index, 0) == value) { - value_to_set = index; - break; - } - } - SendDlgItemMessage(hWnd, combo_box, CB_SETCURSEL, (WPARAM) value_to_set, - 0); -} - /* initialize player selector dialog */ void plselInitDialog(HWND hWnd) { + struct plsel_data * data = (plsel_data_t *) GetWindowLongPtr(hWnd, GWLP_USERDATA); TCHAR wbuf[BUFSZ]; + LVCOLUMN lvcol; + data->control_role = GetDlgItem(hWnd, IDC_PLSEL_ROLE_LIST); + data->control_race = GetDlgItem(hWnd, IDC_PLSEL_RACE_LIST); + + ZeroMemory(&lvcol, sizeof(lvcol)); + lvcol.mask = LVCF_WIDTH; + lvcol.cx = GetSystemMetrics(SM_CXFULLSCREEN); + + /* build role list */ + ListView_InsertColumn(data->control_role, 0, &lvcol); + data->role_count = 0; + for (int i = 0; roles[i].name.m; i++) { + LVITEM lvitem; + ZeroMemory(&lvitem, sizeof(lvitem)); + + lvitem.mask = LVIF_STATE | LVIF_TEXT; + lvitem.iItem = i; + lvitem.iSubItem = 0; + lvitem.state = 0; + lvitem.stateMask = LVIS_FOCUSED; + if (flags.female && roles[i].name.f) + lvitem.pszText = NH_A2W(roles[i].name.f, wbuf, BUFSZ); + else + lvitem.pszText = NH_A2W(roles[i].name.m, wbuf, BUFSZ); + if (ListView_InsertItem(data->control_role, &lvitem) == -1) { + panic("cannot insert menu item"); + } + data->role_count++; + } + + /* build race list */ + ListView_InsertColumn(data->control_race, 0, &lvcol); + data->race_count = 0; + for (int i = 0; races[i].noun; i++) { + LVITEM lvitem; + ZeroMemory(&lvitem, sizeof(lvitem)); + + lvitem.mask = LVIF_STATE | LVIF_TEXT; + lvitem.iItem = i; + lvitem.iSubItem = 0; + lvitem.state = 0; + lvitem.stateMask = LVIS_FOCUSED; + lvitem.pszText = NH_A2W(races[i].noun, wbuf, BUFSZ); + if (ListView_InsertItem(data->control_race, &lvitem) == -1) { + panic("cannot insert menu item"); + } + data->race_count++; + } + + for(int i = 0; i < ROLE_GENDERS; i++) + data->control_genders[i] = GetDlgItem(hWnd, IDC_PLSEL_GENDER_MALE + i); + + for(int i = 0; i < ROLE_ALIGNS; i++) + data->control_aligns[i] = GetDlgItem(hWnd, IDC_PLSEL_ALIGN_LAWFUL + i); + + /* set gender radio button state */ + for (int i = 0; i < ROLE_GENDERS; i++) + Button_Enable(data->control_genders[i], TRUE); + + Button_SetCheck(data->control_genders[0], BST_CHECKED); + + /* set alignment radio button state */ + for (int i = 0; i < ROLE_ALIGNS; i++) + Button_Enable(data->control_aligns[i], TRUE); + + Button_SetCheck(data->control_aligns[0], BST_CHECKED); /* set player name */ SetDlgItemText(hWnd, IDC_PLSEL_NAME, NH_A2W(plname, wbuf, sizeof(wbuf))); - /* check flags for consistency */ - if (flags.initrole >= 0) { - if (flags.initrace >= 0 - && !validrace(flags.initrole, flags.initrace)) { - flags.initrace = ROLE_NONE; - } - - if (flags.initgend >= 0 - && !validgend(flags.initrole, flags.initrace, flags.initgend)) { - flags.initgend = ROLE_NONE; - } - - if (flags.initalign >= 0 - && !validalign(flags.initrole, flags.initrace, flags.initalign)) { - flags.initalign = ROLE_NONE; - } - } + plselRandomize(data); /* populate select boxes */ - plselAdjustLists(hWnd, -1); + plselAdjustSelections(hWnd); - /* intialize roles list */ - if (flags.initrole < 0 - || !ok_role(flags.initrole, ROLE_NONE, ROLE_NONE, ROLE_NONE)) { - CheckDlgButton(hWnd, IDC_PLSEL_ROLE_RANDOM, BST_CHECKED); - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ROLE_LIST), FALSE); - } else { - CheckDlgButton(hWnd, IDC_PLSEL_ROLE_RANDOM, BST_UNCHECKED); - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ROLE_LIST), TRUE); - setComboBoxValue(hWnd, IDC_PLSEL_ROLE_LIST, flags.initrole); - } + /* set tab order */ + SetWindowPos(GetDlgItem(hWnd, IDCANCEL), NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + SetWindowPos(GetDlgItem(hWnd, IDC_PLSEL_RANDOM), NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + SetWindowPos(GetDlgItem(hWnd, IDOK), NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + for(int i = ROLE_GENDERS - 1; i >= 0; i--) + SetWindowPos(data->control_genders[i], NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + for(int i = ROLE_ALIGNS - 1; i >= 0; i--) + SetWindowPos(data->control_aligns[i], NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + SetWindowPos(data->control_race, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + SetWindowPos(data->control_role, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); - /* intialize races list */ - if (flags.initrace < 0 - || !ok_race(flags.initrole, flags.initrace, ROLE_NONE, ROLE_NONE)) { - CheckDlgButton(hWnd, IDC_PLSEL_RACE_RANDOM, BST_CHECKED); - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_RACE_LIST), FALSE); - } else { - CheckDlgButton(hWnd, IDC_PLSEL_RACE_RANDOM, BST_UNCHECKED); - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_RACE_LIST), TRUE); - setComboBoxValue(hWnd, IDC_PLSEL_RACE_LIST, flags.initrace); - } - - /* intialize genders list */ - if (flags.initgend < 0 - || !ok_gend(flags.initrole, flags.initrace, flags.initgend, - ROLE_NONE)) { - CheckDlgButton(hWnd, IDC_PLSEL_GENDER_RANDOM, BST_CHECKED); - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_GENDER_LIST), FALSE); - } else { - CheckDlgButton(hWnd, IDC_PLSEL_GENDER_RANDOM, BST_UNCHECKED); - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_GENDER_LIST), TRUE); - setComboBoxValue(hWnd, IDC_PLSEL_GENDER_LIST, flags.initgend); - } - - /* intialize alignments list */ - if (flags.initalign < 0 - || !ok_align(flags.initrole, flags.initrace, flags.initgend, - flags.initalign)) { - CheckDlgButton(hWnd, IDC_PLSEL_ALIGN_RANDOM, BST_CHECKED); - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ALIGN_LIST), FALSE); - } else { - CheckDlgButton(hWnd, IDC_PLSEL_ALIGN_RANDOM, BST_UNCHECKED); - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ALIGN_LIST), TRUE); - setComboBoxValue(hWnd, IDC_PLSEL_ALIGN_LIST, flags.initalign); - } } -/* adjust role/race/alignment/gender list - filter out - invalid combinations - changed_sel points to the list where selection occurred - (-1 if unknown) -*/ void -plselAdjustLists(HWND hWnd, int changed_sel) +plselAdjustSelections(HWND hWnd) { - HWND control_role, control_race, control_gender, control_align; - int initrole, initrace, initgend, initalign; - int i; - LRESULT ind; - int valid_opt; - TCHAR wbuf[255]; + struct plsel_data * data = (plsel_data_t *) GetWindowLongPtr(hWnd, GWLP_USERDATA); - /* get control handles */ - control_role = GetDlgItem(hWnd, IDC_PLSEL_ROLE_LIST); - control_race = GetDlgItem(hWnd, IDC_PLSEL_RACE_LIST); - control_gender = GetDlgItem(hWnd, IDC_PLSEL_GENDER_LIST); - control_align = GetDlgItem(hWnd, IDC_PLSEL_ALIGN_LIST); + if (!ok_race(flags.initrole, flags.initrace, ROLE_RANDOM, ROLE_RANDOM)) + flags.initrace = pick_race(flags.initrole, ROLE_RANDOM, ROLE_RANDOM, ROLE_RANDOM); - /* get current selections */ - ind = SendMessage(control_role, CB_GETCURSEL, 0, 0); - initrole = (ind == LB_ERR) - ? flags.initrole - : (int) SendMessage(control_role, CB_GETITEMDATA, ind, 0); + if (!ok_gend(flags.initrole, flags.initrace, flags.initgend, ROLE_RANDOM)) + flags.initgend = pick_gend(flags.initrole, flags.initrace, ROLE_RANDOM , ROLE_RANDOM); - ind = SendMessage(control_race, CB_GETCURSEL, 0, 0); - initrace = (ind == LB_ERR) - ? flags.initrace - : (int) SendMessage(control_race, CB_GETITEMDATA, ind, 0); + if (!ok_align(flags.initrole, flags.initrace, flags.initgend, flags.initalign)) + flags.initalign = pick_align(flags.initrole, flags.initrace, flags.initgend , ROLE_RANDOM); - ind = SendMessage(control_gender, CB_GETCURSEL, 0, 0); - initgend = (ind == LB_ERR) ? flags.initgend - : (int) SendMessage(control_gender, - CB_GETITEMDATA, ind, 0); + ListView_RedrawItems(data->control_role, 0, data->role_count - 1); + ListView_RedrawItems(data->control_race, 0, data->race_count - 1); - ind = SendMessage(control_align, CB_GETCURSEL, 0, 0); - initalign = (ind == LB_ERR) ? flags.initalign - : (int) SendMessage(control_align, - CB_GETITEMDATA, ind, 0); - - /* intialize roles list */ - if (changed_sel == -1) { - valid_opt = 0; - - /* reset content and populate the list */ - SendMessage(control_role, CB_RESETCONTENT, 0, 0); - for (i = 0; roles[i].name.m; i++) { - if (initgend >= 0 && flags.female && roles[i].name.f) - ind = SendMessage( - control_role, CB_ADDSTRING, (WPARAM) 0, - (LPARAM) NH_A2W(roles[i].name.f, wbuf, sizeof(wbuf))); - else - ind = SendMessage( - control_role, CB_ADDSTRING, (WPARAM) 0, - (LPARAM) NH_A2W(roles[i].name.m, wbuf, sizeof(wbuf))); - - SendMessage(control_role, CB_SETITEMDATA, (WPARAM) ind, - (LPARAM) i); - if (i == initrole) { - SendMessage(control_role, CB_SETCURSEL, (WPARAM) ind, - (LPARAM) 0); - valid_opt = 1; - } - } - - /* set selection to the previously selected role - if it is still valid */ - if (!valid_opt) { - initrole = ROLE_NONE; - initrace = ROLE_NONE; - initgend = ROLE_NONE; - initalign = ROLE_NONE; - SendMessage(control_role, CB_SETCURSEL, (WPARAM) -1, (LPARAM) 0); - } - - /* trigger change of the races list */ - changed_sel = IDC_PLSEL_ROLE_LIST; + /* set gender radio button state */ + for (int i = 0; i < ROLE_GENDERS; i++) { + BOOL enable = ok_gend(flags.initrole, flags.initrace, i, flags.initalign); + Button_Enable(data->control_genders[i], enable); + LRESULT state = Button_GetCheck(data->control_genders[i]); + if (state == BST_CHECKED && flags.initgend != i) + Button_SetCheck(data->control_genders[i], BST_UNCHECKED); + if (state == BST_UNCHECKED && flags.initgend == i) + Button_SetCheck(data->control_genders[i], BST_CHECKED); } - /* intialize races list */ - if (changed_sel == IDC_PLSEL_ROLE_LIST) { - valid_opt = 0; - - /* reset content and populate the list */ - SendMessage(control_race, CB_RESETCONTENT, 0, 0); - for (i = 0; races[i].noun; i++) - if (ok_race(initrole, i, ROLE_NONE, ROLE_NONE)) { - ind = SendMessage( - control_race, CB_ADDSTRING, (WPARAM) 0, - (LPARAM) NH_A2W(races[i].noun, wbuf, sizeof(wbuf))); - SendMessage(control_race, CB_SETITEMDATA, (WPARAM) ind, - (LPARAM) i); - if (i == initrace) { - SendMessage(control_race, CB_SETCURSEL, (WPARAM) ind, - (LPARAM) 0); - valid_opt = 1; - } - } - - /* set selection to the previously selected race - if it is still valid */ - if (!valid_opt) { - initrace = ROLE_NONE; - initgend = ROLE_NONE; - initalign = ROLE_NONE; - SendMessage(control_race, CB_SETCURSEL, (WPARAM) -1, (LPARAM) 0); - } - - /* trigger change of the genders list */ - changed_sel = IDC_PLSEL_RACE_LIST; + /* set alignment radio button state */ + for (int i = 0; i < ROLE_ALIGNS; i++) { + BOOL enable = ok_align(flags.initrole, flags.initrace, flags.initgend, i); + Button_Enable(data->control_aligns[i], enable); + LRESULT state = Button_GetCheck(data->control_aligns[i]); + if (state == BST_CHECKED && flags.initalign != i) + Button_SetCheck(data->control_aligns[i], BST_UNCHECKED); + if (state == BST_UNCHECKED && flags.initalign == i) + Button_SetCheck(data->control_aligns[i], BST_CHECKED); } - /* intialize genders list */ - if (changed_sel == IDC_PLSEL_RACE_LIST) { - valid_opt = 0; - - /* reset content and populate the list */ - SendMessage(control_gender, CB_RESETCONTENT, 0, 0); - for (i = 0; i < ROLE_GENDERS; i++) - if (ok_gend(initrole, initrace, i, ROLE_NONE)) { - ind = SendMessage( - control_gender, CB_ADDSTRING, (WPARAM) 0, - (LPARAM) NH_A2W(genders[i].adj, wbuf, sizeof(wbuf))); - SendMessage(control_gender, CB_SETITEMDATA, (WPARAM) ind, - (LPARAM) i); - if (i == initgend) { - SendMessage(control_gender, CB_SETCURSEL, (WPARAM) ind, - (LPARAM) 0); - valid_opt = 1; - } - } - - /* set selection to the previously selected gender - if it is still valid */ - if (!valid_opt) { - initgend = ROLE_NONE; - initalign = ROLE_NONE; - SendMessage(control_gender, CB_SETCURSEL, (WPARAM) -1, - (LPARAM) 0); - } - - /* trigger change of the alignments list */ - changed_sel = IDC_PLSEL_GENDER_LIST; - } - - /* intialize alignments list */ - if (changed_sel == IDC_PLSEL_GENDER_LIST) { - valid_opt = 0; - - /* reset content and populate the list */ - SendMessage(control_align, CB_RESETCONTENT, 0, 0); - for (i = 0; i < ROLE_ALIGNS; i++) - if (ok_align(initrole, initrace, initgend, i)) { - ind = SendMessage( - control_align, CB_ADDSTRING, (WPARAM) 0, - (LPARAM) NH_A2W(aligns[i].adj, wbuf, sizeof(wbuf))); - SendMessage(control_align, CB_SETITEMDATA, (WPARAM) ind, - (LPARAM) i); - if (i == initalign) { - SendMessage(control_align, CB_SETCURSEL, (WPARAM) ind, - (LPARAM) 0); - valid_opt = 1; - } - } - - /* set selection to the previously selected alignment - if it is still valid */ - if (!valid_opt) { - initalign = ROLE_NONE; - SendMessage(control_align, CB_SETCURSEL, (WPARAM) -1, (LPARAM) 0); - } - } } /* player made up his mind - get final selection here */ int -plselFinalSelection(HWND hWnd, int *selection) +plselFinalSelection(HWND hWnd) { - LRESULT ind; + int role = flags.initrole; + int race = flags.initrace; + int gender = flags.initgend; + int alignment = flags.initalign; - UNREFERENCED_PARAMETER(selection); - - /* get current selections */ - if (SendDlgItemMessage(hWnd, IDC_PLSEL_ROLE_RANDOM, BM_GETCHECK, 0, 0) - == BST_CHECKED) { - flags.initrole = ROLE_RANDOM; - } else { - ind = - SendDlgItemMessage(hWnd, IDC_PLSEL_ROLE_LIST, CB_GETCURSEL, 0, 0); - flags.initrole = - (ind == LB_ERR) - ? ROLE_RANDOM - : (int) SendDlgItemMessage(hWnd, IDC_PLSEL_ROLE_LIST, - CB_GETITEMDATA, ind, 0); - } - - if (SendDlgItemMessage(hWnd, IDC_PLSEL_RACE_RANDOM, BM_GETCHECK, 0, 0) - == BST_CHECKED) { - flags.initrace = ROLE_RANDOM; - } else { - ind = - SendDlgItemMessage(hWnd, IDC_PLSEL_RACE_LIST, CB_GETCURSEL, 0, 0); - flags.initrace = - (ind == LB_ERR) - ? ROLE_RANDOM - : (int) SendDlgItemMessage(hWnd, IDC_PLSEL_RACE_LIST, - CB_GETITEMDATA, ind, 0); - } - - if (SendDlgItemMessage(hWnd, IDC_PLSEL_GENDER_RANDOM, BM_GETCHECK, 0, 0) - == BST_CHECKED) { - flags.initgend = ROLE_RANDOM; - } else { - ind = SendDlgItemMessage(hWnd, IDC_PLSEL_GENDER_LIST, CB_GETCURSEL, 0, - 0); - flags.initgend = - (ind == LB_ERR) - ? ROLE_RANDOM - : (int) SendDlgItemMessage(hWnd, IDC_PLSEL_GENDER_LIST, - CB_GETITEMDATA, ind, 0); - } - - if (SendDlgItemMessage(hWnd, IDC_PLSEL_ALIGN_RANDOM, BM_GETCHECK, 0, 0) - == BST_CHECKED) { - flags.initalign = ROLE_RANDOM; - } else { - ind = SendDlgItemMessage(hWnd, IDC_PLSEL_ALIGN_LIST, CB_GETCURSEL, 0, - 0); - flags.initalign = - (ind == LB_ERR) - ? ROLE_RANDOM - : (int) SendDlgItemMessage(hWnd, IDC_PLSEL_ALIGN_LIST, - CB_GETITEMDATA, ind, 0); - } - - /* check the role */ - if (flags.initrole == ROLE_RANDOM) { - flags.initrole = pick_role(flags.initrace, flags.initgend, - flags.initalign, PICK_RANDOM); - if (flags.initrole < 0) { - NHMessageBox(hWnd, TEXT("Incompatible role!"), - MB_ICONSTOP | MB_OK); - return FALSE; - } - } - - /* Select a race, if necessary */ - /* force compatibility with role */ - if (flags.initrace == ROLE_RANDOM - || !validrace(flags.initrole, flags.initrace)) { - /* pre-selected race not valid */ - if (flags.initrace == ROLE_RANDOM) { - flags.initrace = pick_race(flags.initrole, flags.initgend, - flags.initalign, PICK_RANDOM); - } - - if (flags.initrace < 0) { - NHMessageBox(hWnd, TEXT("Incompatible race!"), - MB_ICONSTOP | MB_OK); - return FALSE; - } - } - - /* Select a gender, if necessary */ - /* force compatibility with role/race, try for compatibility with - * pre-selected alignment */ - if (flags.initgend < 0 - || !validgend(flags.initrole, flags.initrace, flags.initgend)) { - /* pre-selected gender not valid */ - if (flags.initgend == ROLE_RANDOM) { - flags.initgend = pick_gend(flags.initrole, flags.initrace, - flags.initalign, PICK_RANDOM); - } - - if (flags.initgend < 0) { - NHMessageBox(hWnd, TEXT("Incompatible gender!"), - MB_ICONSTOP | MB_OK); - return FALSE; - } - } - - /* Select an alignment, if necessary */ - /* force compatibility with role/race/gender */ - if (flags.initalign < 0 - || !validalign(flags.initrole, flags.initrace, flags.initalign)) { - /* pre-selected alignment not valid */ - if (flags.initalign == ROLE_RANDOM) { - flags.initalign = pick_align(flags.initrole, flags.initrace, - flags.initgend, PICK_RANDOM); - } else { - NHMessageBox(hWnd, TEXT("Incompatible alignment!"), - MB_ICONSTOP | MB_OK); - return FALSE; - } - } + assert(role != ROLE_RANDOM && role != ROLE_NONE); + assert(race != ROLE_RANDOM && race != ROLE_NONE); + assert(gender != ROLE_RANDOM && gender != ROLE_NONE); + assert(alignment != ROLE_RANDOM && alignment != ROLE_NONE); + assert(ok_role(role, race, gender, alignment)); + assert(ok_race(role, race, gender, alignment)); + assert(ok_gend(role, race, gender, alignment)); + assert(ok_align(role, race, gender, alignment)); + + return TRUE; +} + +static boolean plselRandomize(plsel_data_t * data) +{ + boolean fully_specified = TRUE; + + // restore back to configuration settings + flags.initrole = data->config_role; + flags.initrace = data->config_race; + flags.initgend = data->config_gender; + flags.initalign = data->config_alignment; + + if (!flags.randomall) { + if(flags.initrole == ROLE_NONE || flags.initrace == ROLE_NONE + || flags.initgend == ROLE_NONE || flags.initalign == ROLE_NONE) + fully_specified = FALSE; + } + + if (flags.initrole == ROLE_NONE) + flags.initrole = ROLE_RANDOM; + if (flags.initrace == ROLE_NONE) + flags.initrace = ROLE_RANDOM; + if (flags.initgend == ROLE_NONE) + flags.initgend = ROLE_RANDOM; + if (flags.initalign == ROLE_NONE) + flags.initalign = ROLE_RANDOM; + + rigid_role_checks(); + + int role = flags.initrole; + int race = flags.initrace; + int gender = flags.initgend; + int alignment = flags.initalign; + + assert(role != ROLE_RANDOM && role != ROLE_NONE); + assert(race != ROLE_RANDOM && race != ROLE_NONE); + assert(gender != ROLE_RANDOM && gender != ROLE_NONE); + assert(alignment != ROLE_RANDOM && alignment != ROLE_NONE); + + if (!ok_role(role, race, gender, alignment)) { + fully_specified = FALSE; + flags.initrole = ROLE_RANDOM; + } + + if (!ok_race(role, race, gender, alignment)) { + fully_specified = FALSE; + flags.initrace = ROLE_RANDOM; + } + + if (!ok_gend(role, race, gender, alignment)) { + fully_specified = FALSE; + flags.initgend = ROLE_RANDOM; + } + + if(!ok_align(role, race, gender, alignment)) + { + fully_specified = FALSE; + flags.initalign = ROLE_RANDOM; + } + + rigid_role_checks(); + + role = flags.initrole; + race = flags.initrace; + gender = flags.initgend; + alignment = flags.initalign; + + assert(role != ROLE_RANDOM && role != ROLE_NONE); + assert(race != ROLE_RANDOM && race != ROLE_NONE); + assert(gender != ROLE_RANDOM && gender != ROLE_NONE); + assert(alignment != ROLE_RANDOM && alignment != ROLE_NONE); + assert(ok_role(role, race, gender, alignment)); + assert(ok_race(role, race, gender, alignment)); + assert(ok_gend(role, race, gender, alignment)); + assert(ok_align(role, race, gender, alignment)); + + return fully_specified; +} + +/*-----------------------------------------------------------------------------*/ +BOOL +plselDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam) +{ + LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam; + struct plsel_data * data = (plsel_data_t *) GetWindowLongPtr(hWnd, GWLP_USERDATA); + + /* If there are no list box items, skip this message. */ + if (lpdis->itemID < 0) + return FALSE; + + HWND control = GetDlgItem(hWnd, wParam); + int i = lpdis->itemID; + + { + char buf[64]; + sprintf(buf, "DRAW %lx %d\n", (unsigned long)control, i); + OutputDebugStringA(buf); + } + + const char * string; + + boolean ok = TRUE; + boolean selected; + + if (wParam == IDC_PLSEL_ROLE_LIST) { + if (flags.female && roles[i].name.f) + string = roles[i].name.f; + else + string = roles[i].name.m; + selected = (flags.initrole == i); + } else { + assert(wParam == IDC_PLSEL_RACE_LIST); + ok = ok_race(flags.initrole, i, ROLE_RANDOM, ROLE_RANDOM); + string = races[i].noun; + selected = (flags.initrace == i); + } + + SetBkMode(lpdis->hDC, OPAQUE); + HBRUSH brush; + if (selected) { + brush = CreateSolidBrush(RGB(0, 0, 0)); + SetTextColor(lpdis->hDC, RGB(255, 255, 255)); + SetBkColor(lpdis->hDC, RGB(0, 0, 0)); + } else { + brush = CreateSolidBrush(RGB(255, 255, 255)); + if (!ok) + SetTextColor(lpdis->hDC, RGB(220, 0, 0)); + else + SetTextColor(lpdis->hDC, RGB(0, 0, 0)); + SetBkColor(lpdis->hDC, RGB(255, 255, 255)); + } + + FillRect(lpdis->hDC, &lpdis->rcItem, brush); + RECT rect = lpdis->rcItem; + rect.left += 5; + DrawTextA(lpdis->hDC, string, strlen(string), &rect, + DT_LEFT | DT_SINGLELINE | DT_VCENTER); + + if (data->focus == control) { + if (lpdis->itemState & LVIS_FOCUSED) { + /* draw focus rect */ + RECT client_rt; + + GetClientRect(lpdis->hwndItem, &client_rt); + SetRect(&rect, client_rt.left, lpdis->rcItem.top, + client_rt.left + ListView_GetColumnWidth(lpdis->hwndItem, 0), + lpdis->rcItem.bottom); + DrawFocusRect(lpdis->hDC, &rect); + + { + char buf[64]; + sprintf(buf, "FOCUS %lx %d\n", (unsigned long)control, i); + OutputDebugStringA(buf); + } + } + } + + DeleteObject(brush); return TRUE; } diff --git a/win/win32/mhdlg.h b/win/win32/mhdlg.h index 60f392901..c028fc82b 100644 --- a/win/win32/mhdlg.h +++ b/win/win32/mhdlg.h @@ -12,6 +12,6 @@ int mswin_getlin_window(const char *question, char *result, size_t result_size); int mswin_ext_cmd_window(int *selection); -int mswin_player_selection_window(int *selection); +boolean mswin_player_selection_window(); #endif /* MSWINDlgWindow_h */ diff --git a/win/win32/mswproc.c b/win/win32/mswproc.c index c20fffbff..c0cd44f5d 100644 --- a/win/win32/mswproc.c +++ b/win/win32/mswproc.c @@ -260,8 +260,6 @@ mswin_init_nhwindows(int *argc, char **argv) void mswin_player_selection(void) { - int nRole; - logDebug("mswin_player_selection()\n"); if (iflags.wc_player_selection == VIA_DIALOG) { @@ -311,7 +309,7 @@ mswin_player_selection(void) } } else { /* select a role */ - if (mswin_player_selection_window(&nRole) == IDCANCEL) { + if (!mswin_player_selection_window()) { bail(0); } } diff --git a/win/win32/resource.h b/win/win32/resource.h index 98b6ba1b8..899007b9f 100644 --- a/win/win32/resource.h +++ b/win/win32/resource.h @@ -2,155 +2,155 @@ // Microsoft Visual C++ generated include file. // Used by winhack.rc // -#define IDC_MYICON 2 -#define IDD_WINHACK_DIALOG 102 -#define IDD_ABOUTBOX 103 -#define IDS_APP_TITLE 103 -#define IDM_ABOUT 104 -#define IDM_EXIT 105 -#define IDS_HELLO 106 -#define IDI_NETHACKW 107 -#define IDC_NETHACKW 109 -#define IDS_APP_TITLE_SHORT 110 -#define IDR_MAINFRAME 128 -#define IDB_TILES 129 -#define IDD_TEXT 130 -#define IDD_NHTEXT 130 -#define IDD_MENU 132 -#define IDB_MENU_SEL 133 -#define IDB_MENU_UNSEL 134 -#define IDD_COMMANDS 136 -#define IDD_GETLIN 138 -#define IDD_EXTCMD 139 -#define IDD_PLAYER_SELECTOR 141 -#define IDB_PETMARK 143 -#define IDB_MENU_SEL_COUNT 144 -#define IDD_NHRIP 145 -#define IDB_SPLASH 146 -#define IDB_RIP 147 -#define IDD_SPLASH 148 -#define IDB_PILEMARK 149 -#define IDC_TEXT_VIEW 1000 -#define IDC_TEXT_CONTROL 1000 -#define IDC_CMD_MOVE_NW 1001 -#define IDC_CMD_MOVE_N 1002 -#define IDC_MENU_LIST 1003 -#define IDC_CMD_MOVE_NE 1003 -#define IDC_MENU_TEXT 1004 -#define IDC_CMD_MOVE_W 1004 -#define IDC_CMD_MOVE_SELF 1005 -#define IDC_CMD_MOVE_E 1006 -#define IDC_CMD_MOVE_SW 1007 -#define IDC_CMD_MOVE_S 1008 -#define IDC_CMD_MOVE_SE 1009 -#define IDC_CMD_MOVE_UP 1010 -#define IDC_CMD_MOVE_DOWN 1011 -#define IDC_CMD_5 1012 -#define IDC_CMD_A 1013 -#define IDC_CMD_B 1014 -#define IDC_CMD_C 1015 -#define IDC_CMD_D 1016 -#define IDC_CMD_E 1017 -#define IDC_CMD_F 1018 -#define IDC_CMD_G 1019 -#define IDC_CMD_H 1020 -#define IDC_CMD_I 1021 -#define IDC_CMD_J 1022 -#define IDC_CMD_K 1023 -#define IDC_CMD_L 1024 -#define IDC_CMD_M 1025 -#define IDC_CMD_N 1026 -#define IDC_CMD_O 1027 -#define IDC_CMD_P 1028 -#define IDC_CMD_Q 1029 -#define IDC_CMD_R 1030 -#define IDC_CMD_S 1031 -#define IDC_CMD_T 1032 -#define IDC_CMD_U 1033 -#define IDC_CMD_V 1034 -#define IDC_CMD_W 1035 -#define IDC_CMD_X 1036 -#define IDC_CMD_Y 1037 -#define IDC_CMD_Z 1038 -#define IDC_CMD_AA 1039 -#define IDC_CMD_BB 1040 -#define IDC_CMD_CC 1041 -#define IDC_CMD_DD 1042 -#define IDC_CMD_EE 1043 -#define IDC_CMD_FF 1044 -#define IDC_CMD_GG 1045 -#define IDC_CMD_HH 1046 -#define IDC_CMD_II 1047 -#define IDC_CMD_JJ 1048 -#define IDC_CMD_KK 1049 -#define IDC_CMD_LL 1050 -#define IDC_CMD_MM 1051 -#define IDC_CMD_NN 1052 -#define IDC_CMD_OO 1053 -#define IDC_CMD_PP 1054 -#define IDC_CMD_QQ 1055 -#define IDC_CMD_RR 1056 -#define IDC_CMD_SS 1057 -#define IDC_CMD_TT 1058 -#define IDC_CMD_UU 1059 -#define IDC_CMD_VV 1060 -#define IDC_CMD_WW 1061 -#define IDC_CMD_XX 1062 -#define IDC_CMD_YY 1063 -#define IDC_CMD_ZZ 1064 -#define IDC_CMD_FIRST 1100 -#define IDC_CMD_LAST 1300 -#define IDC_GETLIN_EDIT 1309 -#define IDC_EXTCMD_LIST 1310 -#define IDC_PLSEL_NAME 1314 -#define IDC_PLSEL_ROLE_RANDOM 1315 -#define IDC_PLSEL_RACE_RANDOM 1318 -#define IDC_PLSEL_GENDER_RANDOM 1319 -#define IDC_PLSEL_ALIGN_RANDOM 1320 -#define IDC_PLSEL_ROLE_LIST 1323 -#define IDC_PLSEL_RACE_LIST 1324 -#define IDC_PLSEL_ALIGN_LIST 1325 -#define IDC_PLSEL_GENDER_LIST 1326 -#define IDC_ABOUT_VERSION 1327 -#define IDC_ABOUT_COPYRIGHT 1328 -#define IDC_EXTRAINFO 1331 -#define IDM_SAVE 32771 -#define IDM_HELP_LONG 32772 -#define IDM_HELP_COMMANDS 32773 -#define IDM_HELP_HISTORY 32774 -#define IDM_HELP_INFO_CHAR 32775 -#define IDM_HELP_INFO_KEY 32776 -#define IDM_HELP_OPTIONS 32777 -#define IDM_HELP_OPTIONS_LONG 32778 -#define IDM_HELP_EXTCMD 32779 -#define IDM_HELP_LICENSE 32780 -#define IDM_HELP_PORTHELP 32781 -#define IDM_MAP_TILES 32782 -#define IDM_MAP_ASCII4X6 32783 -#define IDM_MAP_ASCII6X8 32784 -#define IDM_MAP_ASCII8X8 32785 -#define IDM_MAP_ASCII16X8 32786 -#define IDM_MAP_ASCII7X12 32787 -#define IDM_MAP_ASCII8X12 32788 -#define IDM_MAP_ASCII16X12 32789 -#define IDM_MAP_ASCII12X16 32790 -#define IDM_MAP_ASCII10X18 32791 -#define IDM_MAP_FIT_TO_SCREEN 32792 -#define IDM_NHMODE 32794 -#define IDM_CLEARSETTINGS 32795 -#define IDM_SETTING_AUTOLAYOUT 32796 -#define IDM_SETTING_LOCKWINDOWS 32797 +#define IDC_MYICON 2 +#define IDD_WINHACK_DIALOG 102 +#define IDD_ABOUTBOX 103 +#define IDS_APP_TITLE 103 +#define IDM_ABOUT 104 +#define IDM_EXIT 105 +#define IDS_HELLO 106 +#define IDI_NETHACKW 107 +#define IDC_NETHACKW 109 +#define IDS_APP_TITLE_SHORT 110 +#define IDR_MAINFRAME 128 +#define IDB_TILES 129 +#define IDD_TEXT 130 +#define IDD_NHTEXT 130 +#define IDD_MENU 132 +#define IDB_MENU_SEL 133 +#define IDB_MENU_UNSEL 134 +#define IDD_COMMANDS 136 +#define IDD_GETLIN 138 +#define IDD_EXTCMD 139 +#define IDD_PLAYER_SELECTOR 141 +#define IDB_PETMARK 143 +#define IDB_MENU_SEL_COUNT 144 +#define IDD_NHRIP 145 +#define IDB_SPLASH 146 +#define IDB_RIP 147 +#define IDD_SPLASH 148 +#define IDB_PILEMARK 149 +#define IDC_TEXT_VIEW 1000 +#define IDC_TEXT_CONTROL 1000 +#define IDC_CMD_MOVE_NW 1001 +#define IDC_CMD_MOVE_N 1002 +#define IDC_MENU_LIST 1003 +#define IDC_CMD_MOVE_NE 1003 +#define IDC_MENU_TEXT 1004 +#define IDC_CMD_MOVE_W 1004 +#define IDC_CMD_MOVE_SELF 1005 +#define IDC_CMD_MOVE_E 1006 +#define IDC_CMD_MOVE_SW 1007 +#define IDC_CMD_MOVE_S 1008 +#define IDC_CMD_MOVE_SE 1009 +#define IDC_CMD_MOVE_UP 1010 +#define IDC_CMD_MOVE_DOWN 1011 +#define IDC_CMD_5 1012 +#define IDC_CMD_A 1013 +#define IDC_CMD_B 1014 +#define IDC_CMD_C 1015 +#define IDC_CMD_D 1016 +#define IDC_CMD_E 1017 +#define IDC_CMD_F 1018 +#define IDC_CMD_G 1019 +#define IDC_CMD_H 1020 +#define IDC_CMD_I 1021 +#define IDC_CMD_J 1022 +#define IDC_CMD_K 1023 +#define IDC_CMD_L 1024 +#define IDC_CMD_M 1025 +#define IDC_CMD_N 1026 +#define IDC_CMD_O 1027 +#define IDC_CMD_P 1028 +#define IDC_CMD_Q 1029 +#define IDC_CMD_R 1030 +#define IDC_CMD_S 1031 +#define IDC_CMD_T 1032 +#define IDC_CMD_U 1033 +#define IDC_CMD_V 1034 +#define IDC_CMD_W 1035 +#define IDC_CMD_X 1036 +#define IDC_CMD_Y 1037 +#define IDC_CMD_Z 1038 +#define IDC_CMD_AA 1039 +#define IDC_CMD_BB 1040 +#define IDC_CMD_CC 1041 +#define IDC_CMD_DD 1042 +#define IDC_CMD_EE 1043 +#define IDC_CMD_FF 1044 +#define IDC_CMD_GG 1045 +#define IDC_CMD_HH 1046 +#define IDC_CMD_II 1047 +#define IDC_CMD_JJ 1048 +#define IDC_CMD_KK 1049 +#define IDC_CMD_LL 1050 +#define IDC_CMD_MM 1051 +#define IDC_CMD_NN 1052 +#define IDC_CMD_OO 1053 +#define IDC_CMD_PP 1054 +#define IDC_CMD_QQ 1055 +#define IDC_CMD_RR 1056 +#define IDC_CMD_SS 1057 +#define IDC_CMD_TT 1058 +#define IDC_CMD_UU 1059 +#define IDC_CMD_VV 1060 +#define IDC_CMD_WW 1061 +#define IDC_CMD_XX 1062 +#define IDC_CMD_YY 1063 +#define IDC_CMD_ZZ 1064 +#define IDC_CMD_FIRST 1100 +#define IDC_CMD_LAST 1300 +#define IDC_GETLIN_EDIT 1309 +#define IDC_EXTCMD_LIST 1310 +#define IDC_PLSEL_NAME 1314 +#define IDC_PLSEL_RANDOM 1315 +#define IDC_ABOUT_VERSION 1327 +#define IDC_ABOUT_COPYRIGHT 1328 +#define IDC_EXTRAINFO 1331 +#define IDC_PLSEL_ROLE_LIST 1332 +#define IDC_PLSEL_RACE_LIST 1333 +#define IDC_PLSEL_ALIGN_LAWFUL 1334 +#define IDC_PLSEL_ALIGN_NEUTRAL 1335 +#define IDC_PLSEL_ALIGN_CHAOTIC 1336 +#define IDC_PLSEL_GENDER_MALE 1337 +#define IDC_PLSEL_GENDER_FEMALE 1338 +#define IDM_SAVE 32771 +#define IDM_HELP_LONG 32772 +#define IDM_HELP_COMMANDS 32773 +#define IDM_HELP_HISTORY 32774 +#define IDM_HELP_INFO_CHAR 32775 +#define IDM_HELP_INFO_KEY 32776 +#define IDM_HELP_OPTIONS 32777 +#define IDM_HELP_OPTIONS_LONG 32778 +#define IDM_HELP_EXTCMD 32779 +#define IDM_HELP_LICENSE 32780 +#define IDM_HELP_PORTHELP 32781 +#define IDM_MAP_TILES 32782 +#define IDM_MAP_ASCII4X6 32783 +#define IDM_MAP_ASCII6X8 32784 +#define IDM_MAP_ASCII8X8 32785 +#define IDM_MAP_ASCII16X8 32786 +#define IDM_MAP_ASCII7X12 32787 +#define IDM_MAP_ASCII8X12 32788 +#define IDM_MAP_ASCII16X12 32789 +#define IDM_MAP_ASCII12X16 32790 +#define IDM_MAP_ASCII10X18 32791 +#define IDM_MAP_FIT_TO_SCREEN 32792 +#define IDM_NHMODE 32794 +#define IDM_CLEARSETTINGS 32795 +#define IDM_SETTING_AUTOLAYOUT 32796 +#define IDM_SETTING_LOCKWINDOWS 32797 #define IDM_SETTING_SCREEN_TO_CLIPBOARD 32798 -#define IDM_SETTING_SCREEN_TO_FILE 32799 -#define IDC_STATIC -1 +#define IDM_SETTING_SCREEN_TO_FILE 32799 +#define IDC_STATIC -1 // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 145 -#define _APS_NEXT_COMMAND_VALUE 32800 -#define _APS_NEXT_CONTROL_VALUE 1332 -#define _APS_NEXT_SYMED_VALUE 110 +#define _APS_NEXT_RESOURCE_VALUE 146 +#define _APS_NEXT_COMMAND_VALUE 32800 +#define _APS_NEXT_CONTROL_VALUE 1341 +#define _APS_NEXT_SYMED_VALUE 110 #endif #endif diff --git a/win/win32/winMS.h b/win/win32/winMS.h index 0347674ff..c5ee77368 100644 --- a/win/win32/winMS.h +++ b/win/win32/winMS.h @@ -29,6 +29,7 @@ #define WIN32_LEAN_AND_MEAN #include +#include #include #include #include "hack.h" diff --git a/win/win32/winhack.rc b/win/win32/winhack.rc index 4c69358c9..06876aecf 100644 --- a/win/win32/winhack.rc +++ b/win/win32/winhack.rc @@ -1,4 +1,4 @@ -//Microsoft Developer Studio generated resource script. +// Microsoft Visual C++ generated resource script. // #include "resource.h" @@ -19,13 +19,11 @@ LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources +// English (United States) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) -#endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // @@ -34,14 +32,15 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. -IDI_NETHACKW ICON DISCARDABLE "NETHACK.ICO" +IDI_NETHACKW ICON "NETHACK.ICO" + ///////////////////////////////////////////////////////////////////////////// // // Menu // -IDC_NETHACKW MENU DISCARDABLE +IDC_NETHACKW MENU BEGIN POPUP "&File" BEGIN @@ -98,7 +97,7 @@ END // Accelerator // -IDC_NETHACKW ACCELERATORS MOVEABLE PURE +IDC_NETHACKW ACCELERATORS BEGIN "?", IDM_ABOUT, ASCII, ALT "/", IDM_ABOUT, ASCII, ALT @@ -110,8 +109,8 @@ END // Dialog // -IDD_ABOUTBOX DIALOG DISCARDABLE 22, 17, 230, 75 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +IDD_ABOUTBOX DIALOG 22, 17, 230, 75 +STYLE DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "About" FONT 8, "System" BEGIN @@ -121,29 +120,27 @@ BEGIN END IDD_NHTEXT DIALOGEX 0, 0, 172, 178 -STYLE WS_CHILD | WS_CLIPSIBLINGS | WS_THICKFRAME +STYLE DS_SETFONT | WS_CHILD | WS_CLIPSIBLINGS | WS_THICKFRAME EXSTYLE WS_EX_CLIENTEDGE | WS_EX_CONTROLPARENT -FONT 8, "MS Sans Serif", 0, 0 +FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN - EDITTEXT IDC_TEXT_CONTROL,0,0,172,160,ES_MULTILINE | - ES_OEMCONVERT | ES_READONLY | WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP + EDITTEXT IDC_TEXT_CONTROL,0,0,172,160,ES_MULTILINE | ES_OEMCONVERT | ES_READONLY | WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP DEFPUSHBUTTON "OK",IDOK,54,163,50,14,BS_FLAT | NOT WS_TABSTOP END IDD_MENU DIALOGEX 0, 0, 187, 153 -STYLE WS_CHILD | WS_CLIPSIBLINGS | WS_THICKFRAME +STYLE DS_SETFONT | WS_CHILD | WS_CLIPSIBLINGS | WS_THICKFRAME EXSTYLE WS_EX_CLIENTEDGE | WS_EX_CONTROLPARENT -FONT 8, "MS Sans Serif", 0, 0 +FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN LISTBOX IDC_MENU_LIST,10,10,170,55,LBS_SORT | NOT WS_BORDER - EDITTEXT IDC_MENU_TEXT,10,70,170,60,ES_MULTILINE | ES_OEMCONVERT | - ES_READONLY | WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP | NOT WS_BORDER + EDITTEXT IDC_MENU_TEXT,10,70,170,60,ES_MULTILINE | ES_OEMCONVERT | ES_READONLY | NOT WS_BORDER | WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP DEFPUSHBUTTON "OK",IDOK,7,132,50,14,BS_FLAT | NOT WS_TABSTOP PUSHBUTTON "Cancel",IDCANCEL,130,132,50,14,BS_FLAT | NOT WS_TABSTOP END -IDD_GETLIN DIALOG DISCARDABLE 0, 0, 131, 29 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +IDD_GETLIN DIALOG 0, 0, 131, 29 +STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Question?" FONT 8, "MS Sans Serif" BEGIN @@ -152,65 +149,54 @@ BEGIN EDITTEXT IDC_GETLIN_EDIT,0,0,130,13,ES_AUTOHSCROLL END -IDD_EXTCMD DIALOG DISCARDABLE 0, 0, 137, 117 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +IDD_EXTCMD DIALOG 0, 0, 137, 117 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Extended Commands" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,80,7,50,14 PUSHBUTTON "Cancel",IDCANCEL,80,24,50,14 - LISTBOX IDC_EXTCMD_LIST,7,7,65,103,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP + LISTBOX IDC_EXTCMD_LIST,7,7,65,103,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP END -IDD_PLAYER_SELECTOR DIALOG DISCARDABLE 0, 0, 152, 169 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +IDD_PLAYER_SELECTOR DIALOGEX 0, 0, 225, 212 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "What are you?" -FONT 8, "MS Sans Serif" +FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - DEFPUSHBUTTON "Play",IDOK,7,148,66,14 - PUSHBUTTON "Quit",IDCANCEL,79,148,66,14 - LTEXT "Name:",IDC_STATIC,7,8,25,10 - EDITTEXT IDC_PLSEL_NAME,40,7,105,12,ES_AUTOHSCROLL | ES_READONLY | - NOT WS_TABSTOP - GROUPBOX "Role",IDC_STATIC,7,21,138,30 - CONTROL "Random",IDC_PLSEL_ROLE_RANDOM,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,34,40,10 - COMBOBOX IDC_PLSEL_ROLE_LIST,63,33,75,50,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - GROUPBOX "Race",IDC_STATIC,7,51,138,30 - CONTROL "Random",IDC_PLSEL_RACE_RANDOM,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,14,63,40,10 - COMBOBOX IDC_PLSEL_RACE_LIST,63,62,75,45,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - GROUPBOX "Gender",IDC_STATIC,7,81,138,30 - CONTROL "Random",IDC_PLSEL_GENDER_RANDOM,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,14,93,40,10 - COMBOBOX IDC_PLSEL_GENDER_LIST,63,92,75,40,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - GROUPBOX "Alignment",IDC_STATIC,7,111,138,30 - CONTROL "Random",IDC_PLSEL_ALIGN_RANDOM,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,13,123,40,10 - COMBOBOX IDC_PLSEL_ALIGN_LIST,63,122,75,45,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "Play",IDOK,12,192,54,14,WS_GROUP + PUSHBUTTON "Quit",IDCANCEL,162,192,54,14,WS_GROUP + EDITTEXT IDC_PLSEL_NAME,12,12,105,12,ES_AUTOHSCROLL | ES_READONLY | WS_GROUP | NOT WS_TABSTOP + CONTROL "Neutral",IDC_PLSEL_ALIGN_NEUTRAL,"Button",BS_AUTORADIOBUTTON,168,60,37,10 + CONTROL "Lawful",IDC_PLSEL_ALIGN_LAWFUL,"Button",BS_AUTORADIOBUTTON | WS_GROUP,168,48,35,10 + CONTROL "Chaotic",IDC_PLSEL_ALIGN_CHAOTIC,"Button",BS_AUTORADIOBUTTON,168,72,38,10 + CONTROL "Male",IDC_PLSEL_GENDER_MALE,"Button",BS_AUTORADIOBUTTON | WS_GROUP,168,108,30,10 + CONTROL "Female",IDC_PLSEL_GENDER_FEMALE,"Button",BS_AUTORADIOBUTTON,168,120,38,10 + GROUPBOX "Alignment",IDC_STATIC,162,36,48,54 + GROUPBOX "Gender",IDC_STATIC,162,96,48,42 + GROUPBOX "Role",IDC_STATIC,6,36,72,150 + GROUPBOX "Race",IDC_STATIC,84,36,72,72 + PUSHBUTTON "Random",IDC_PLSEL_RANDOM,90,192,54,14,WS_GROUP + GROUPBOX "Name",IDC_STATIC,6,0,120,30 + CONTROL "",IDC_PLSEL_ROLE_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_OWNERDRAWFIXED | LVS_ALIGNLEFT | LVS_NOSCROLL | LVS_NOCOLUMNHEADER | WS_BORDER | WS_GROUP | WS_TABSTOP,12,48,60,130 + CONTROL "",IDC_PLSEL_RACE_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_OWNERDRAWFIXED | LVS_ALIGNLEFT | LVS_NOSCROLL | LVS_NOCOLUMNHEADER | WS_BORDER | WS_GROUP | WS_TABSTOP,90,48,60,51 END IDD_NHRIP DIALOGEX 0, 0, 281, 209 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Here lies..." -FONT 8, "MS Sans Serif", 0, 0 +FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN DEFPUSHBUTTON "OK",IDOK,82,188,50,14 END -IDD_SPLASH DIALOG DISCARDABLE 0, 0, 281, 257 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +IDD_SPLASH DIALOG 0, 0, 281, 257 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Welcome to NetHack" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,224,236,50,14 - EDITTEXT IDC_EXTRAINFO,7,176,267,52,ES_MULTILINE | ES_READONLY | - WS_VSCROLL + EDITTEXT IDC_EXTRAINFO,7,176,267,52,ES_MULTILINE | ES_READONLY | WS_VSCROLL END @@ -220,7 +206,7 @@ END // TEXTINCLUDE // -2 TEXTINCLUDE DISCARDABLE +2 TEXTINCLUDE BEGIN "#if defined(__BORLANDC__)\r\n" "LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US\r\n" @@ -232,13 +218,13 @@ BEGIN "\0" END -3 TEXTINCLUDE DISCARDABLE +3 TEXTINCLUDE BEGIN "\r\n" "\0" END -1 TEXTINCLUDE DISCARDABLE +1 TEXTINCLUDE BEGIN "resource.h\0" END @@ -251,14 +237,22 @@ END // Bitmap // -IDB_TILES BITMAP DISCARDABLE "tiles.bmp" -IDB_MENU_SEL BITMAP DISCARDABLE "mnsel.bmp" -IDB_MENU_UNSEL BITMAP DISCARDABLE "mnunsel.bmp" -IDB_PETMARK BITMAP DISCARDABLE "petmark.bmp" -IDB_PILEMARK BITMAP DISCARDABLE "pilemark.bmp" -IDB_MENU_SEL_COUNT BITMAP DISCARDABLE "mnselcnt.bmp" -IDB_RIP BITMAP DISCARDABLE "rip.bmp" -IDB_SPLASH BITMAP DISCARDABLE "splash.bmp" +IDB_TILES BITMAP "tiles.bmp" + +IDB_MENU_SEL BITMAP "mnsel.bmp" + +IDB_MENU_UNSEL BITMAP "mnunsel.bmp" + +IDB_PETMARK BITMAP "petmark.bmp" + +IDB_PILEMARK BITMAP "pilemark.bmp" + +IDB_MENU_SEL_COUNT BITMAP "mnselcnt.bmp" + +IDB_RIP BITMAP "rip.bmp" + +IDB_SPLASH BITMAP "splash.bmp" + ///////////////////////////////////////////////////////////////////////////// // @@ -266,7 +260,7 @@ IDB_SPLASH BITMAP DISCARDABLE "splash.bmp" // #ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE +GUIDELINES DESIGNINFO BEGIN IDD_NHTEXT, DIALOG BEGIN @@ -297,9 +291,9 @@ BEGIN IDD_PLAYER_SELECTOR, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 145 + RIGHTMARGIN, 218 TOPMARGIN, 7 - BOTTOMMARGIN, 162 + BOTTOMMARGIN, 205 END IDD_NHRIP, DIALOG @@ -342,14 +336,14 @@ BEGIN BEGIN BLOCK "040904b0" BEGIN - VALUE "FileDescription", "NetHack for Windows - Graphical Interface\0" - VALUE "FileVersion", "3.6.1\0" - VALUE "InternalName", "NetHackW\0" - VALUE "LegalCopyright", "Copyright (C) 1985 - 2017. By Stichting Mathematisch Centrum and M. Stephenson. See license for details.\0" - VALUE "OriginalFilename", "NetHackW.exe\0" - VALUE "PrivateBuild", "140606\0" - VALUE "ProductName", "NetHack\0" - VALUE "ProductVersion", "3.6.1\0" + VALUE "FileDescription", "NetHack for Windows - Graphical Interface" + VALUE "FileVersion", "3.6.1" + VALUE "InternalName", "NetHackW" + VALUE "LegalCopyright", "Copyright (C) 1985 - 2017. By Stichting Mathematisch Centrum and M. Stephenson. See license for details." + VALUE "OriginalFilename", "NetHackW.exe" + VALUE "PrivateBuild", "140606" + VALUE "ProductName", "NetHack" + VALUE "ProductVersion", "3.6.1" END END BLOCK "VarFileInfo" @@ -358,19 +352,31 @@ BEGIN END END + +///////////////////////////////////////////////////////////////////////////// +// +// AFX_DIALOG_LAYOUT +// + +IDD_PLAYER_SELECTOR AFX_DIALOG_LAYOUT +BEGIN + 0 +END + + ///////////////////////////////////////////////////////////////////////////// // // String Table // -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN IDS_APP_TITLE "NetHack for Windows - Graphical Interface" IDC_NETHACKW "NETHACKW" IDS_APP_TITLE_SHORT "NetHack for Windows" END -#endif // English (U.S.) resources +#endif // English (United States) resources /////////////////////////////////////////////////////////////////////////////