- added ALT-keys support (except ALT-f and ALT-m which are menu

accelerators).
[...]

- added F4/F5 functionality - same as in MSDOS port
F4 toggles between fitting the tiled display to the screen
and full size (compresses the tiles to fit / uncompresses).
F5 alternates between ascii and tiles.

- added support for wc_vary_msgcount
This commit is contained in:
nethack.allison
2002-02-21 12:57:56 +00:00
parent 3910f060db
commit eea83e29ea
6 changed files with 159 additions and 31 deletions

View File

@@ -180,6 +180,7 @@ extern NEARDATA struct window_procs windowprocs;
#define MAP_MODE_ASCII12x16 8
#define MAP_MODE_ASCII10x18 9
#define MAP_MODE_ASCII_FIT_TO_SCREEN 10
#define MAP_MODE_TILES_FIT_TO_SCREEN 11
#if 0
#define WC_SND_SOUND 0x01L /* 01 Port has some sound capabilities */

View File

@@ -15,7 +15,7 @@
#define MAX_LOADSTRING 100
typedef struct mswin_nethack_main_window {
int dummy;
int mapAcsiiModeSave;
} NHMainWindow, *PNHMainWindow;
static TCHAR szMainWindowClass[] = TEXT("MSNHMainWndClass");
@@ -125,11 +125,18 @@ numpad[KEY_LAST][3] = {
{'.', ':', ':'} /* Del */
};
static const unsigned char alt_commands[] = "acdeijlnNopqrstuvw?2";
/* original: "acdefijlmnNopqrstuvw?2"; */
#define STATEON(x) ((GetKeyState(x) & 0xFFFE) != 0)
#define KEYTABLE(x) ((iflags.num_pad ? numpad : keypad)[x] \
[(STATEON(VK_SHIFT) ? 1 : STATEON(VK_CONTROL) ? 2 : 0)])
/* map mode macros */
#define IS_MAP_FIT_TO_SCREEN(mode) ((mode)==MAP_MODE_ASCII_FIT_TO_SCREEN || \
(mode)==MAP_MODE_TILES_FIT_TO_SCREEN )
#define IS_MAP_ASCII(mode) ((mode)!=MAP_MODE_TILES && (mode)!=MAP_MODE_TILES_FIT_TO_SCREEN)
/*
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
@@ -147,6 +154,7 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
data = (PNHMainWindow)malloc(sizeof(NHMainWindow));
if( !data ) panic("out of memory");
ZeroMemory(data, sizeof(NHMainWindow));
data->mapAcsiiModeSave = MAP_MODE_ASCII12x16;
SetWindowLong(hWnd, GWL_USERDATA, (LONG)data);
GetNHApp()->hMainWnd = hWnd;
@@ -158,11 +166,13 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
case WM_KEYDOWN:
{
data = (PNHMainWindow)GetWindowLong(hWnd, GWL_USERDATA);
/* translate arrow keys into nethack commands */
switch (wParam)
{
case VK_LEFT:
if( GetKeyState(VK_CONTROL)&0x80 ) {
if( STATEON(VK_CONTROL) ) {
/* scroll map window one line left */
SendMessage(
mswin_hwnd_from_winid(WIN_MAP),
@@ -176,7 +186,7 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
return 0;
case VK_RIGHT:
if( GetKeyState(VK_CONTROL)&0x80 ) {
if( STATEON(VK_CONTROL) ) {
/* scroll map window one line right */
SendMessage(
mswin_hwnd_from_winid(WIN_MAP),
@@ -190,7 +200,7 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
return 0;
case VK_UP:
if( GetKeyState(VK_CONTROL)&0x80 ) {
if( STATEON(VK_CONTROL) ) {
/* scroll map window one line up */
SendMessage(
mswin_hwnd_from_winid(WIN_MAP),
@@ -204,7 +214,7 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
return 0;
case VK_DOWN:
if( GetKeyState(VK_CONTROL)&0x80 ) {
if( STATEON(VK_CONTROL) ) {
/* scroll map window one line down */
SendMessage(
mswin_hwnd_from_winid(WIN_MAP),
@@ -218,7 +228,7 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
return 0;
case VK_HOME:
if( GetKeyState(VK_CONTROL)&0x80 ) {
if( STATEON(VK_CONTROL) ) {
/* scroll map window to upper left corner */
SendMessage(
mswin_hwnd_from_winid(WIN_MAP),
@@ -239,7 +249,7 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
return 0;
case VK_END:
if( GetKeyState(VK_CONTROL)&0x80 ) {
if( STATEON(VK_CONTROL) ) {
/* scroll map window to lower right corner */
SendMessage(
mswin_hwnd_from_winid(WIN_MAP),
@@ -260,7 +270,7 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
return 0;
case VK_PRIOR:
if( GetKeyState(VK_CONTROL)&0x80 ) {
if( STATEON(VK_CONTROL) ) {
/* scroll map window one page up */
SendMessage(
mswin_hwnd_from_winid(WIN_MAP),
@@ -274,7 +284,7 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
return 0;
case VK_NEXT:
if( GetKeyState(VK_CONTROL)&0x80 ) {
if( STATEON(VK_CONTROL) ) {
/* scroll map window one page down */
SendMessage(
mswin_hwnd_from_winid(WIN_MAP),
@@ -305,12 +315,36 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
NHEVENT_KBD(KEYTABLE(KEY_PLUS));
return 0;
case VK_F3:
mswin_select_map_mode(MAP_MODE_TILES);
case VK_F4:
if( IS_MAP_FIT_TO_SCREEN(iflags.wc_map_mode) ) {
mswin_select_map_mode(
IS_MAP_ASCII(iflags.wc_map_mode)?
data->mapAcsiiModeSave :
MAP_MODE_TILES
);
} else {
mswin_select_map_mode(
IS_MAP_ASCII(iflags.wc_map_mode)?
MAP_MODE_ASCII_FIT_TO_SCREEN :
MAP_MODE_TILES_FIT_TO_SCREEN
);
}
return 0;
case VK_F4:
mswin_select_map_mode(MAP_MODE_ASCII_FIT_TO_SCREEN);
case VK_F5:
if( IS_MAP_ASCII(iflags.wc_map_mode) ) {
if( IS_MAP_FIT_TO_SCREEN(iflags.wc_map_mode) ) {
mswin_select_map_mode(MAP_MODE_TILES_FIT_TO_SCREEN);
} else {
mswin_select_map_mode(MAP_MODE_TILES);
}
} else {
if( IS_MAP_FIT_TO_SCREEN(iflags.wc_map_mode) ) {
mswin_select_map_mode(MAP_MODE_ASCII_FIT_TO_SCREEN);
} else {
mswin_select_map_mode(data->mapAcsiiModeSave);
}
}
return 0;
default: {
@@ -332,6 +366,25 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
} /* end switch */
} break;
case WM_SYSKEYDOWN:
{
/* see if this is something we need */
WORD c;
BYTE kbd_state[256];
c = 0;
ZeroMemory(kbd_state, sizeof(kbd_state));
GetKeyboardState(kbd_state);
if( ToAscii( wParam, (lParam>>16)&0xFF, kbd_state, &c, 0) &&
index(alt_commands, c&0xFF) ) {
NHEVENT_KBD( M(c&0xFF) );
return 0;
} else {
return DefWindowProc(hWnd, message, wParam, lParam);
}
} break;
case WM_COMMAND:
/* process commands - menu commands mostly */
if( onWMCommand(hWnd, wParam, lParam) )
@@ -573,7 +626,9 @@ void mswin_layout_main_window(HWND changed_child)
LRESULT onWMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PNHMainWindow data;
data = (PNHMainWindow)GetWindowLong(hWnd, GWL_USERDATA);
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
@@ -602,10 +657,25 @@ LRESULT onWMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
case IDM_MAP_ASCII12X16:
case IDM_MAP_ASCII16X12:
case IDM_MAP_ASCII10X18:
case IDM_MAP_FIT_TO_SCREEN:
mswin_select_map_mode(menuid2mapmode(wmId));
break;
case IDM_MAP_FIT_TO_SCREEN:
if( IS_MAP_FIT_TO_SCREEN(iflags.wc_map_mode) ) {
mswin_select_map_mode(
IS_MAP_ASCII(iflags.wc_map_mode)?
data->mapAcsiiModeSave :
MAP_MODE_TILES
);
} else {
mswin_select_map_mode(
IS_MAP_ASCII(iflags.wc_map_mode)?
MAP_MODE_ASCII_FIT_TO_SCREEN :
MAP_MODE_TILES_FIT_TO_SCREEN
);
}
break;
case IDM_HELP_LONG:
display_file(HELP, TRUE);
break;
@@ -704,18 +774,43 @@ LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
void mswin_select_map_mode(int mode)
{
CheckMenuRadioItem(
GetMenu(GetNHApp()->hMainWnd),
IDM_MAP_TILES,
IDM_MAP_FIT_TO_SCREEN,
mapmode2menuid(mode),
MF_BYCOMMAND);
PNHMainWindow data;
data = (PNHMainWindow)GetWindowLong(GetNHApp()->hMainWnd, GWL_USERDATA);
/* override for Rogue level */
#ifdef REINCARNATION
if( Is_rogue_level(&u.uz) ) return;
if( Is_rogue_level(&u.uz) && !IS_MAP_ASCII(mode) ) return;
#endif
/* set map mode menu mark */
if( IS_MAP_ASCII(mode) ) {
CheckMenuRadioItem(
GetMenu(GetNHApp()->hMainWnd),
IDM_MAP_TILES,
IDM_MAP_ASCII10X18,
mapmode2menuid( IS_MAP_FIT_TO_SCREEN(mode)? data->mapAcsiiModeSave : mode ),
MF_BYCOMMAND);
} else {
CheckMenuRadioItem(
GetMenu(GetNHApp()->hMainWnd),
IDM_MAP_TILES,
IDM_MAP_ASCII10X18,
mapmode2menuid( MAP_MODE_TILES ),
MF_BYCOMMAND);
}
/* set fit-to-screen mode mark */
CheckMenuItem(
GetMenu(GetNHApp()->hMainWnd),
IDM_MAP_FIT_TO_SCREEN,
MF_BYCOMMAND |
(IS_MAP_FIT_TO_SCREEN(mode)? MF_CHECKED : MF_UNCHECKED)
);
if( IS_MAP_ASCII(iflags.wc_map_mode) && !IS_MAP_FIT_TO_SCREEN(iflags.wc_map_mode)) {
data->mapAcsiiModeSave = iflags.wc_map_mode;
}
iflags.wc_map_mode = mode;
mswin_map_mode(mswin_hwnd_from_winid(WIN_MAP), mode);
}

View File

@@ -20,6 +20,7 @@ typedef struct mswin_nethack_map_window {
int mapMode; /* current map mode */
boolean bAsciiMode; /* switch ASCII/tiled mode */
boolean bFitToScreenMode; /* switch Fit map to screen mode on/off */
int xPos, yPos; /* scroll position */
int xPageSize, yPageSize; /* scroll page size */
int xCur, yCur; /* position of the cursor */
@@ -91,8 +92,8 @@ void mswin_map_stretch(HWND hWnd, LPSIZE lpsz, BOOL redraw)
/* set new screen tile size */
data = (PNHMapWindow)GetWindowLong(hWnd, GWL_USERDATA);
data->xScrTile = ((data->mapMode==MAP_MODE_ASCII_FIT_TO_SCREEN)? wnd_size.cx : lpsz->cx) / COLNO;
data->yScrTile = ((data->mapMode==MAP_MODE_ASCII_FIT_TO_SCREEN)? wnd_size.cy : lpsz->cy) / ROWNO;
data->xScrTile = (data->bFitToScreenMode? wnd_size.cx : lpsz->cx) / COLNO;
data->yScrTile = (data->bFitToScreenMode? wnd_size.cy : lpsz->cy) / ROWNO;
/* set map origin point */
data->map_orig.x = max(0, client_rt.left + (wnd_size.cx - data->xScrTile*COLNO)/2 );
@@ -102,7 +103,7 @@ void mswin_map_stretch(HWND hWnd, LPSIZE lpsz, BOOL redraw)
data->map_orig.y -= data->map_orig.y % data->yScrTile;
/* adjust horizontal scroll bar */
if( data->mapMode==MAP_MODE_ASCII_FIT_TO_SCREEN )
if( data->bFitToScreenMode )
data->xPageSize = COLNO+1; /* disable scroll bar */
else
data->xPageSize = wnd_size.cx/data->xScrTile;
@@ -124,7 +125,7 @@ void mswin_map_stretch(HWND hWnd, LPSIZE lpsz, BOOL redraw)
SetScrollInfo(hWnd, SB_HORZ, &si, TRUE);
/* adjust vertical scroll bar */
if( data->mapMode==MAP_MODE_ASCII_FIT_TO_SCREEN )
if( data->bFitToScreenMode )
data->yPageSize = ROWNO+1; /* disable scroll bar */
else
data->yPageSize = wnd_size.cy/data->yScrTile;
@@ -186,54 +187,63 @@ int mswin_map_mode(HWND hWnd, int mode)
case MAP_MODE_ASCII4x6:
data->bAsciiMode = TRUE;
data->bFitToScreenMode = FALSE;
mapSize.cx = 4*COLNO;
mapSize.cy = 6*ROWNO;
break;
case MAP_MODE_ASCII6x8:
data->bAsciiMode = TRUE;
data->bFitToScreenMode = FALSE;
mapSize.cx = 6*COLNO;
mapSize.cy = 8*ROWNO;
break;
case MAP_MODE_ASCII8x8:
data->bAsciiMode = TRUE;
data->bFitToScreenMode = FALSE;
mapSize.cx = 8*COLNO;
mapSize.cy = 8*ROWNO;
break;
case MAP_MODE_ASCII16x8:
data->bAsciiMode = TRUE;
data->bFitToScreenMode = FALSE;
mapSize.cx = 16*COLNO;
mapSize.cy = 8*ROWNO;
break;
case MAP_MODE_ASCII7x12:
data->bAsciiMode = TRUE;
data->bFitToScreenMode = FALSE;
mapSize.cx = 7*COLNO;
mapSize.cy = 12*ROWNO;
break;
case MAP_MODE_ASCII8x12:
data->bAsciiMode = TRUE;
data->bFitToScreenMode = FALSE;
mapSize.cx = 8*COLNO;
mapSize.cy = 12*ROWNO;
break;
case MAP_MODE_ASCII16x12:
data->bAsciiMode = TRUE;
data->bFitToScreenMode = FALSE;
mapSize.cx = 16*COLNO;
mapSize.cy = 12*ROWNO;
break;
case MAP_MODE_ASCII12x16:
data->bAsciiMode = TRUE;
data->bFitToScreenMode = FALSE;
mapSize.cx = 12*COLNO;
mapSize.cy = 16*ROWNO;
break;
case MAP_MODE_ASCII10x18:
data->bAsciiMode = TRUE;
data->bFitToScreenMode = FALSE;
mapSize.cx = 10*COLNO;
mapSize.cy = 18*ROWNO;
break;
@@ -245,11 +255,23 @@ int mswin_map_mode(HWND hWnd, int mode)
mapSize.cy = client_rt.bottom - client_rt.top;
data->bAsciiMode = TRUE;
data->bFitToScreenMode = TRUE;
} break;
case MAP_MODE_TILES_FIT_TO_SCREEN: {
RECT client_rt;
GetClientRect(hWnd, &client_rt);
mapSize.cx = client_rt.right - client_rt.left;
mapSize.cy = client_rt.bottom - client_rt.top;
data->bAsciiMode = FALSE;
data->bFitToScreenMode = TRUE;
} break;
case MAP_MODE_TILES:
default:
data->bAsciiMode = FALSE;
data->bFitToScreenMode = FALSE;
mapSize.cx = GetNHApp()->mapTile_X*COLNO;
mapSize.cy = GetNHApp()->mapTile_Y*ROWNO;
break;
@@ -320,7 +342,7 @@ LRESULT CALLBACK MapWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
{
SIZE size;
if( data->mapMode == MAP_MODE_ASCII_FIT_TO_SCREEN ) {
if( data->bFitToScreenMode ) {
size.cx = LOWORD(lParam);
size.cy = HIWORD(lParam);
} else {

View File

@@ -8,7 +8,7 @@
#define MSG_WRAP_TEXT
#define MSG_VISIBLE_LINES 4
#define MSG_VISIBLE_LINES max(iflags.wc_vary_msgcount, 2)
#define MAX_MSG_LINES 32
#define MSG_LINES (int)min(iflags.msg_history, MAX_MSG_LINES)
#define MAXWINDOWTEXT 200

View File

@@ -40,7 +40,7 @@ struct window_procs mswin_procs = {
WC_INVERSE|WC_SCROLL_MARGIN|WC_MAP_MODE|
WC_FONT_MESSAGE|WC_FONT_STATUS|WC_FONT_MENU|WC_FONT_TEXT|
WC_FONTSIZ_MESSAGE|WC_FONTSIZ_STATUS|WC_FONTSIZ_MENU|WC_FONTSIZ_TEXT|
WC_TILE_WIDTH|WC_TILE_HEIGHT|WC_TILE_FILE,
WC_TILE_WIDTH|WC_TILE_HEIGHT|WC_TILE_FILE|WC_VARY_MSGCOUNT,
mswin_init_nhwindows,
mswin_player_selection,
mswin_askname,
@@ -143,6 +143,8 @@ void mswin_init_nhwindows(int* argc, char** argv)
if( iflags.wc_tile_width==0 ) iflags.wc_tile_width = TILE_X;
if( iflags.wc_tile_height==0 ) iflags.wc_tile_height = TILE_Y;
if( iflags.wc_vary_msgcount==0 ) iflags.wc_vary_msgcount = 4;
/* force tabs in menus */
iflags.menu_tab_sep = 1;
@@ -168,7 +170,8 @@ void mswin_init_nhwindows(int* argc, char** argv)
WC_FONTSIZ_MESSAGE |
WC_FONTSIZ_STATUS |
WC_FONTSIZ_MENU |
WC_FONTSIZ_TEXT,
WC_FONTSIZ_TEXT |
WC_VARY_MSGCOUNT,
SET_IN_GAME
);
@@ -1181,6 +1184,12 @@ void mswin_preference_update(const char *pref)
mswin_layout_main_window(NULL);
return;
}
if( stricmp( pref, "vary_msgcount")==0 ) {
InvalidateRect(mswin_hwnd_from_winid(WIN_MESSAGE), NULL, TRUE);
mswin_layout_main_window(NULL);
return;
}
}

View File

@@ -61,7 +61,8 @@ BEGIN
MENUITEM "&7 - ASCII (16x12)", IDM_MAP_ASCII16X12
MENUITEM "&8 - ASCII (12x16)", IDM_MAP_ASCII12X16
MENUITEM "&9 - ASCII (10x18)", IDM_MAP_ASCII10X18
MENUITEM "&Fit To Screen (ASCII only)", IDM_MAP_FIT_TO_SCREEN
MENUITEM SEPARATOR
MENUITEM "&Fit To Screen ", IDM_MAP_FIT_TO_SCREEN
END
POPUP "&Help"
BEGIN