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