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
+419 -439
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;
if (!plselRandomize(&data)) {
/* create modal dialog */ /* create modal dialog */
ret = DialogBoxParam( ret = DialogBoxParam(
GetNHApp()->hApp, MAKEINTRESOURCE(IDD_PLAYER_SELECTOR), GetNHApp()->hApp, MAKEINTRESOURCE(IDD_PLAYER_SELECTOR),
GetNHApp()->hMainWnd, PlayerSelectorDlgProc, (LPARAM) &data); GetNHApp()->hMainWnd, PlayerSelectorDlgProc, (LPARAM) &data);
if (ret == -1) if (ret == -1)
panic("Cannot create getlin window"); 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:
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; 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 /* set alignment radio button state */
if it is still valid */ for (int i = 0; i < ROLE_ALIGNS; i++) {
if (!valid_opt) { BOOL enable = ok_align(flags.initrole, flags.initrace, flags.initgend, i);
initrole = ROLE_NONE; Button_Enable(data->control_aligns[i], enable);
initrace = ROLE_NONE; LRESULT state = Button_GetCheck(data->control_aligns[i]);
initgend = ROLE_NONE; if (state == BST_CHECKED && flags.initalign != i)
initalign = ROLE_NONE; Button_SetCheck(data->control_aligns[i], BST_UNCHECKED);
SendMessage(control_role, CB_SETCURSEL, (WPARAM) -1, (LPARAM) 0); if (state == BST_UNCHECKED && flags.initalign == i)
Button_SetCheck(data->control_aligns[i], BST_CHECKED);
} }
/* trigger change of the races list */
changed_sel = IDC_PLSEL_ROLE_LIST;
}
/* 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;
}
/* 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);
} }
} }
+10 -10
View File
@@ -103,17 +103,17 @@
#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_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_VERSION 1327
#define IDC_ABOUT_COPYRIGHT 1328 #define IDC_ABOUT_COPYRIGHT 1328
#define IDC_EXTRAINFO 1331 #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_SAVE 32771
#define IDM_HELP_LONG 32772 #define IDM_HELP_LONG 32772
#define IDM_HELP_COMMANDS 32773 #define IDM_HELP_COMMANDS 32773
@@ -148,9 +148,9 @@
// //
#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
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////