📄 main-win.c
字号:
char c;
int x, min_x, max_x;
int y, min_y, max_y;
#ifdef USE_TRANSPARENCY
byte ta;
char tc;
#endif /* USE_TRANSPARENCY */
#ifndef ZANGBAND
s16b py = p_ptr->py;
s16b px = p_ptr->px;
#endif /* ZANGBAND */
#ifdef ZANGBAND
td->map_tile_wid = (td->tile_wid * td->cols) / MAX_WID;
td->map_tile_hgt = (td->tile_hgt * td->rows) / MAX_HGT;
/* Is the player in the wilderness? */
if (dun_level == 0)
{
/* Work out offset of corner of dungeon-sized segment of the wilderness */
min_x = wild_grid.x_min;
min_y = wild_grid.y_min;
max_x = wild_grid.x_max;
max_y = wild_grid.y_max;
}
else
{
min_x = 0;
min_y = 0;
max_x = cur_wid;
max_y = cur_hgt;
}
#else /* ZANGBAND */
td->map_tile_wid = (td->tile_wid * td->cols) / DUNGEON_WID;
td->map_tile_hgt = (td->tile_hgt * td->rows) / DUNGEON_HGT;
min_x = 0;
min_y = 0;
max_x = DUNGEON_WID;
max_y = DUNGEON_HGT;
#endif /* ZANGBAND */
/* Draw the map */
for (x = min_x; x < max_x; x++)
{
for (y = min_y; y < max_y; y++)
{
#ifdef USE_TRANSPARENCY
map_info(y, x, &a, &c, &ta, &tc);
#else /* USE_TRANSPARENCY */
map_info(y, x, &a, &c);
#endif /* USE_TRANSPARENCY */
/* Ignore non-graphics */
if ((a & 0x80) && (c & 0x80))
{
#ifdef USE_TRANSPARENCY
Term_pict_win(x - min_x, y - min_y, 1, &a, &c, &ta, &tc);
#else /* USE_TRANSPARENCY */
Term_pict_win(x - min_x, y - min_y, 1, &a, &c);
#endif /* USE_TRANSPARENCY */
}
}
}
/* Hilite the player */
Term_curs_win(px - min_x, py - min_y);
}
/*
* MEGA_HACK - Display a graphical map of the dungeon.
*/
static void windows_map(void)
{
term_data *td = &data[0];
char ch;
/* Only in graphics mode since the fonts can't be scaled */
if (!use_graphics) return;
/* Clear screen */
Term_xtra_win_clear();
td->map_active = TRUE;
/* Draw the map */
windows_map_aux();
/* Wait for a keypress, flush key buffer */
Term_inkey(&ch, TRUE, TRUE);
Term_flush();
/* Switch off the map display */
td->map_active = FALSE;
/* Restore screen */
Term_xtra_win_clear();
Term_redraw();
}
/*** Other routines ***/
/*
* Create and initialize a "term_data" given a title
*/
static void term_data_link(term_data *td)
{
term *t = &td->t;
/* Initialize the term */
term_init(t, td->cols, td->rows, td->keys);
/* Use a "software" cursor */
t->soft_cursor = TRUE;
/* Use "Term_pict" for "graphic" data */
t->higher_pict = TRUE;
/* Erase with "white space" */
t->attr_blank = TERM_WHITE;
t->char_blank = ' ';
#if 0
/* Prepare the init/nuke hooks */
t->init_hook = Term_init_win;
t->nuke_hook = Term_nuke_win;
#endif /* 0 */
/* Prepare the template hooks */
t->user_hook = Term_user_win;
t->xtra_hook = Term_xtra_win;
t->curs_hook = Term_curs_win;
t->wipe_hook = Term_wipe_win;
t->text_hook = Term_text_win;
t->pict_hook = Term_pict_win;
/* Remember where we came from */
t->data = (vptr)(td);
}
/*
* Create the windows
*
* First, instantiate the "default" values, then read the "ini_file"
* to over-ride selected values, then create the windows, and fonts.
*
* Must use SW_SHOW not SW_SHOWNA, since on 256 color display
* must make active to realize the palette. XXX XXX XXX
*/
static void init_windows(void)
{
int i;
term_data *td;
char buf[1024];
/* Main window */
td = &data[0];
WIPE(td, term_data);
td->s = angband_term_name[0];
td->keys = 1024;
td->rows = 24;
td->cols = 80;
td->visible = TRUE;
td->size_ow1 = 2;
td->size_ow2 = 2;
td->size_oh1 = 2;
td->size_oh2 = 2;
td->pos_x = 30;
td->pos_y = 20;
/* Sub windows */
for (i = 1; i < MAX_TERM_DATA; i++)
{
td = &data[i];
WIPE(td, term_data);
td->s = angband_term_name[i];
td->keys = 16;
td->rows = 24;
td->cols = 80;
td->visible = FALSE;
td->size_ow1 = 1;
td->size_ow2 = 1;
td->size_oh1 = 1;
td->size_oh2 = 1;
td->pos_x = (7 - i) * 30;
td->pos_y = (7 - i) * 20;
}
/* Load prefs */
load_prefs();
/* Main window (need these before term_getsize gets called) */
td = &data[0];
td->dwStyle = (WS_OVERLAPPED | WS_THICKFRAME | WS_SYSMENU |
WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION |
WS_VISIBLE);
td->dwExStyle = 0;
td->visible = TRUE;
/* Sub windows (need these before term_getsize gets called) */
for (i = 1; i < MAX_TERM_DATA; i++)
{
td = &data[i];
td->dwStyle = (WS_OVERLAPPED | WS_THICKFRAME | WS_SYSMENU | WS_CAPTION);
td->dwExStyle = (WS_EX_TOOLWINDOW);
}
/* All windows */
for (i = 0; i < MAX_TERM_DATA; i++)
{
td = &data[i];
/* Access the standard font file */
path_build(buf, 1024, ANGBAND_DIR_XTRA_FONT, td->font_want);
/* Activate the chosen font */
if (term_force_font(td, buf))
{
/* Access the standard font file */
path_build(buf, 1024, ANGBAND_DIR_XTRA_FONT, "8X13.FON");
/* Force the use of that font */
(void)term_force_font(td, buf);
/* Oops */
td->tile_wid = 8;
td->tile_hgt = 13;
/* Assume not bizarre */
td->bizarre = FALSE;
}
/* Analyze the font */
term_getsize(td);
/* Resize the window */
term_window_resize(td);
}
/* Sub windows (reverse order) */
for (i = MAX_TERM_DATA - 1; i >= 1; --i)
{
td = &data[i];
my_td = td;
td->w = CreateWindowEx(td->dwExStyle, AngList,
td->s, td->dwStyle,
td->pos_x, td->pos_y,
td->size_wid, td->size_hgt,
HWND_DESKTOP, NULL, hInstance, NULL);
my_td = NULL;
if (!td->w) quit("Failed to create sub-window");
if (td->visible)
{
td->size_hack = TRUE;
ShowWindow(td->w, SW_SHOW);
td->size_hack = FALSE;
}
term_data_link(td);
angband_term[i] = &td->t;
if (td->visible)
{
/* Activate the window */
SetActiveWindow(td->w);
/* Bring window to top */
SetWindowPos(td->w, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}
}
/* Main window */
td = &data[0];
/* Main window */
my_td = td;
td->w = CreateWindowEx(td->dwExStyle, AppName,
td->s, td->dwStyle,
td->pos_x, td->pos_y,
td->size_wid, td->size_hgt,
HWND_DESKTOP, NULL, hInstance, NULL);
my_td = NULL;
if (!td->w) quit("Failed to create Angband window");
term_data_link(td);
angband_term[0] = &td->t;
/* Activate the main window */
SetActiveWindow(td->w);
/* Bring main window back to top */
SetWindowPos(td->w, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
#ifdef SUPPORT_GAMMA
if (gamma_correction > 0)
build_gamma_table(gamma_correction);
#endif /* SUPPORT_GAMMA */
/* New palette XXX XXX XXX */
(void)new_palette();
/* Create a "brush" for drawing the "cursor" */
hbrYellow = CreateSolidBrush(win_clr[TERM_YELLOW]);
/* Process pending messages */
(void)Term_xtra_win_flush();
}
#ifdef USE_SAVER
/*
* Stop the screensaver
*/
static void stop_screensaver(void)
{
if (screensaver)
SendMessage(data[0].w, WM_CLOSE, 0, 0);
else
SendMessage(data[0].w, WM_COMMAND, IDM_OPTIONS_SAVER, 0);
}
#endif /* USE_SAVER */
/*
* Prepare the menus
*/
static void setup_menus(void)
{
int i;
HMENU hm = GetMenu(data[0].w);
#ifdef USE_SAVER
main_menu = hm;
#endif /* USE_SAVER */
/* Menu "File", Disable all */
EnableMenuItem(hm, IDM_FILE_NEW,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
EnableMenuItem(hm, IDM_FILE_OPEN,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
EnableMenuItem(hm, IDM_FILE_SAVE,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
EnableMenuItem(hm, IDM_FILE_EXIT,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
EnableMenuItem(hm, IDM_FILE_SCORE,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
/* No character available */
if (!character_generated)
{
/* Menu "File", Item "New" */
EnableMenuItem(hm, IDM_FILE_NEW, MF_BYCOMMAND | MF_ENABLED);
/* Menu "File", Item "Open" */
EnableMenuItem(hm, IDM_FILE_OPEN, MF_BYCOMMAND | MF_ENABLED);
}
/* A character available */
if (character_generated)
{
/* Menu "File", Item "Save" */
EnableMenuItem(hm, IDM_FILE_SAVE, MF_BYCOMMAND | MF_ENABLED);
}
/* Menu "File", Item "Exit" */
EnableMenuItem(hm, IDM_FILE_EXIT, MF_BYCOMMAND | MF_ENABLED);
/* Menu "File", Item "Show Scores" */
EnableMenuItem(hm, IDM_FILE_SCORE, MF_BYCOMMAND | MF_ENABLED);
/* Menu "Window::Visibility" */
for (i = 0; i < MAX_TERM_DATA; i++)
{
EnableMenuItem(hm, IDM_WINDOW_VIS_0 + i,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
CheckMenuItem(hm, IDM_WINDOW_VIS_0 + i,
(data[i].visible ? MF_CHECKED : MF_UNCHECKED));
EnableMenuItem(hm, IDM_WINDOW_VIS_0 + i,
MF_BYCOMMAND | MF_ENABLED);
}
/* Menu "Window::Font" */
for (i = 0; i < MAX_TERM_DATA; i++)
{
EnableMenuItem(hm, IDM_WINDOW_FONT_0 + i,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
if (data[i].visible)
{
EnableMenuItem(hm, IDM_WINDOW_FONT_0 + i,
MF_BYCOMMAND | MF_ENABLED);
}
}
/* Menu "Window::Bizarre Display" */
for (i = 0; i < MAX_TERM_DATA; i++)
{
EnableMenuItem(hm, IDM_WINDOW_BIZ_0 + i,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
CheckMenuItem(hm, IDM_WINDOW_BIZ_0 + i,
(data[i].bizarre ? MF_CHECKED : MF_UNCHECKED));
if (data[i].visible)
{
EnableMenuItem(hm, IDM_WINDOW_BIZ_0 + i,
MF_BYCOMMAND | MF_ENABLED);
}
}
/* Menu "Window::Increase Tile Width" */
for (i = 0; i < MAX_TERM_DATA; i++)
{
EnableMenuItem(hm, IDM_WINDOW_I_WID_0 + i,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
if (data[i].visible)
{
EnableMenuItem(hm, IDM_WINDOW_I_WID_0 + i,
MF_BYCOMMAND | MF_ENABLED);
}
}
/* Menu "Window::Decrease Tile Width" */
for (i = 0; i < MAX_TERM_DATA; i++)
{
EnableMenuItem(hm, IDM_WINDOW_D_WID_0 + i,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
if (data[i].visible)
{
EnableMenuItem(hm, IDM_WINDOW_D_WID_0 + i,
MF_BYCOMMAND | MF_ENABLED);
}
}
/* Menu "Window::Increase Tile Height" */
for (i = 0; i < MAX_TERM_DATA; i++)
{
EnableMenuItem(hm, IDM_WINDOW_I_HGT_0 + i,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
if (data[i].visible)
{
EnableMenuItem(hm, IDM_WINDOW_I_HGT_0 + i,
MF_BYCOMMAND | MF_ENABLED);
}
}
/* Menu "Window::Decrease Tile Height" */
for (i = 0; i < MAX_TERM_DATA; i++)
{
EnableMenuItem(hm, IDM_WINDOW_D_HGT_0 + i,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
if (data[i].visible)
{
EnableMenuItem(hm, IDM_WINDOW_D_HGT_0 + i,
MF_BYCOMMAND | MF_ENABLED);
}
}
/* Menu "Options", disable all */
EnableMenuItem(hm, IDM_OPTIONS_NO_GRAPHICS,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
EnableMenuItem(hm, IDM_OPTIONS_OLD_GRAPHICS,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
EnableMenuItem(hm, IDM_OPTIONS_NEW_GRAPHICS,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
EnableMenuItem(hm, IDM_OPTIONS_SOUND,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
EnableMenuItem(hm, IDM_OPTIONS_SAVER,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
EnableMenuItem(hm, IDM_OPTIONS_LOW_PRIORITY,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
/* Menu "Options", Item "Map" */
if (use_graphics != GRAPHICS_NONE)
EnableMenuItem(GetMenu(data[0].w), IDM_OPTIONS_MAP, MF_BYCOMMAND | MF_ENABLED);
else
EnableMenuItem(GetMenu(data[0].w), IDM_OPTIONS_MAP,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
/* Menu "Options", update all */
CheckMenuItem(hm, IDM_OPTIONS_NO_GRAPHICS,
(arg_graphics == GRAPHICS_NONE ? MF_CHECKED : MF_UNCHECKED));
CheckMenuItem(hm, IDM_OPTIONS_OLD_GRAPHICS,
(arg_graphics == GRAPHICS_ORIGINAL ? MF_CHECKED : MF_UNCHECKED));
CheckMenuItem(hm, IDM_OPTIONS_NEW_GRAPHICS,
(arg_graphics == GRAPHICS_ADAM_BOLT ? MF_CHECKED : MF_UNCHECKED));
CheckMenuItem(hm, IDM_OPTIONS_SOUND,
(arg_sound ? MF_CHECKED : MF_UNCHECKED));
#ifdef USE_SAVER
CheckMenuItem(hm, IDM_OPTIONS_SAVER,
(hwndSaver ? MF_CHECKED : MF_UNCHECKED));
#endif /* USE_SAVER */
CheckMenuItem(hm, IDM_OPTIONS_LOW_PRIORITY,
(low_priority ? MF_CHECKED : MF_UNCHECKED));
#ifdef USE_GRAPHICS
/* Menu "Options", Item "Graphics" */
EnableMenuItem(hm, IDM_OPTIONS_NO_GRAPHICS, MF_ENABLED);
/* Menu "Options", Item "Graphics" */
EnableMenuItem(hm, IDM_OPTIONS_OLD_GRAPHICS, MF_ENABLED);
/* Menu "Options", Item "Graphics" */
EnableMenuItem(hm, IDM_OPTIONS_NEW_GRAPHICS, MF_ENABLED);
#endif /* USE_GRAPHICS */
#ifdef USE_SOUND
/* Menu "Options", Item "Sound" */
EnableMenuItem(hm, IDM_OPTIONS_SOUND, MF_ENABLED);
#endif /* USE_SOUND */
#ifdef USE_SAVER
/* Menu "Options", Item "ScreenSaver" */
EnableMenuItem(hm, IDM_OPTIONS_SAVER,
MF_BYCOMMAND | MF_ENABLED);
#endif /* USE_SAVER */
EnableMenuItem(hm, IDM_OPTIONS_LOW_PRIORITY,
MF_BYCOMMAND | MF_ENABLED);
}
/*
* Check for double clicked (or dragged) savefile
*
* Apparently, Windows copies the entire filename into the first
* piece of the "command line string". Perhaps we should extract
* the "basename" of that filename and append it to the "save" dir.
*/
static void check_for_save_file(LPSTR cmd_line)
{
char *s, *p;
/* First arg */
s = cmd_line;
/* No args */
if (!s || !*s) return;
/* Next arg */
p = strchr(s, ' ');
/* Tokenize, advance */
if (p) *p++ = '\0';
/* Extract filename */
strcat(savefile, s);
/* Validate the file */
validate_file(savefile);
/* Game in progress */
game_in_progress = TRUE;
Term_fresh();
/* Play game */
play_game(FALSE);
}
#ifdef USE_SAVER
#ifdef ALLOW_BORG
/*
* Hook into the inkey() function so that flushing keypresses
* doesn't affect us.
*
* ToDo: Try to implement recording and playing back of games
* by
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -