#define MAX_LOADSTRING 100
typedef struct mswin_nethack_main_window {
- int dummy;
+ int mapAcsiiModeSave;
} NHMainWindow, *PNHMainWindow;
static TCHAR szMainWindowClass[] = TEXT("MSNHMainWndClass");
{'.', ':', ':'} /* 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)
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;
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),
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),
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),
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),
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),
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),
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),
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),
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: {
} /* 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) )
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);
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;
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);
}
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 */
/* 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 );
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;
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;
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;
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;
{
SIZE size;
- if( data->mapMode == MAP_MODE_ASCII_FIT_TO_SCREEN ) {
+ if( data->bFitToScreenMode ) {
size.cx = LOWORD(lParam);
size.cy = HIWORD(lParam);
} else {