X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fmain-win.c;h=b698e1b3b3c2bb6764731c3c160d3fbb7bac37e1;hb=4c7ac6eeee33d7d5cdaf7d2d3315e8e1d84602bb;hp=82836f9889df614b55216a890999385f4ab82bff;hpb=0d02c41302f2d5089cf94512eb27ba87ae19676a;p=hengband%2Fhengband.git diff --git a/src/main-win.c b/src/main-win.c index 82836f988..b698e1b3b 100644 --- a/src/main-win.c +++ b/src/main-win.c @@ -76,7 +76,7 @@ #ifdef WINDOWS - +#include #include /* @@ -103,6 +103,7 @@ #define IDM_FILE_OPEN 101 #define IDM_FILE_SAVE 110 #define IDM_FILE_SCORE 120 +#define IDM_FILE_MOVIE 121 #define IDM_FILE_EXIT 130 #define IDM_WINDOW_VIS_0 200 @@ -196,7 +197,9 @@ /* * This may need to be removed for some compilers XXX XXX XXX */ +#if 0 #define STRICT +#endif /* * Exclude parts of WINDOWS.H that are not needed @@ -404,7 +407,7 @@ struct _term_data uint map_tile_hgt; bool map_active; -#ifdef JP +#if 1 /* #ifdef JP */ LOGFONT lf; #endif @@ -434,6 +437,16 @@ static term_data data[MAX_TERM_DATA]; static term_data *my_td; /* + * Remember normal size of main window when maxmized + */ +POINT normsize; + +/* + * was main window maximized on previous playing + */ +bool win_maximized = FALSE; + +/* * game in progress */ bool game_in_progress = FALSE; @@ -500,15 +513,11 @@ static bool can_use_graphics = FALSE; */ static DIBINIT infGraph; -#ifdef USE_TRANSPARENCY - /* * The global bitmap mask */ static DIBINIT infMask; -#endif /* USE_TRANSPARENCY */ - #endif /* USE_GRAPHICS */ @@ -519,10 +528,12 @@ static DIBINIT infMask; */ static bool can_use_sound = FALSE; +#define SAMPLE_MAX 8 + /* * An array of sound file names */ -static cptr sound_file[SOUND_MAX]; +static cptr sound_file[SOUND_MAX][SAMPLE_MAX]; #endif /* USE_SOUND */ @@ -545,11 +556,15 @@ static cptr AngList = "AngList"; /* * Directory names */ -static cptr ANGBAND_DIR_XTRA_FONT; static cptr ANGBAND_DIR_XTRA_GRAF; static cptr ANGBAND_DIR_XTRA_SOUND; -static cptr ANGBAND_DIR_XTRA_MUSIC; static cptr ANGBAND_DIR_XTRA_HELP; +#if 0 /* #ifndef JP */ +static cptr ANGBAND_DIR_XTRA_FONT; +#endif +#ifdef USE_MUSIC +static cptr ANGBAND_DIR_XTRA_MUSIC; +#endif /* @@ -559,6 +574,20 @@ static COLORREF win_clr[256]; /* + * Flag for macro trigger with dump ASCII + */ +static bool Term_no_press = FALSE; + +/* + * Copy and paste + */ +static bool mouse_down = FALSE; +static bool paint_rect = FALSE; +static int mousex = 0, mousey = 0; +static int oldx, oldy; + + +/* * The "simple" color values * * See "main-ibm.c" for original table information @@ -599,25 +628,35 @@ static bool ignore_key[256]; * Hack -- initialization list for "special_key" */ static byte special_key_list[] = { -VK_CLEAR,VK_PAUSE,VK_CAPITAL,VK_KANA,VK_JUNJA,VK_FINAL,VK_KANJI, -VK_CONVERT,VK_NONCONVERT,VK_ACCEPT,VK_MODECHANGE, -VK_PRIOR,VK_NEXT,VK_END,VK_HOME,VK_LEFT,VK_UP,VK_RIGHT,VK_DOWN, -VK_SELECT,VK_PRINT,VK_EXECUTE,VK_SNAPSHOT,VK_INSERT,VK_DELETE, -VK_HELP,VK_APPS, -VK_F1,VK_F2,VK_F3,VK_F4,VK_F5,VK_F6,VK_F7,VK_F8,VK_F9,VK_F10, -VK_F11,VK_F12,VK_F13,VK_F14,VK_F15,VK_F16,VK_F17,VK_F18,VK_F19,VK_F20, -VK_F21,VK_F22,VK_F23,VK_F24,VK_NUMLOCK,VK_SCROLL, -VK_ATTN,VK_CRSEL,VK_EXSEL,VK_EREOF,VK_PLAY,VK_ZOOM,VK_NONAME, -VK_PA1,0 + VK_CLEAR, VK_PAUSE, VK_CAPITAL, + VK_KANA, VK_JUNJA, VK_FINAL, VK_KANJI, + VK_CONVERT, VK_NONCONVERT, VK_ACCEPT, VK_MODECHANGE, + VK_PRIOR, VK_NEXT, VK_END, VK_HOME, + VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN, + VK_SELECT, VK_PRINT, VK_EXECUTE, VK_SNAPSHOT, + VK_INSERT, VK_DELETE, VK_HELP, VK_APPS, + VK_NUMPAD0, VK_NUMPAD1, VK_NUMPAD2, VK_NUMPAD3, + VK_NUMPAD4, VK_NUMPAD5, VK_NUMPAD6, VK_NUMPAD7, + VK_NUMPAD8, VK_NUMPAD9, VK_MULTIPLY, VK_ADD, + VK_SEPARATOR, VK_SUBTRACT, VK_DECIMAL, VK_DIVIDE, + VK_F1, VK_F2, VK_F3, VK_F4, VK_F5, VK_F6, + VK_F7, VK_F8, VK_F9, VK_F10, VK_F11, VK_F12, + VK_F13, VK_F14, VK_F15, VK_F16, VK_F17, VK_F18, + VK_F19,VK_F20, VK_F21, VK_F22, VK_F23, VK_F24, + VK_NUMLOCK, VK_SCROLL, VK_ATTN, VK_CRSEL, + VK_EXSEL, VK_EREOF, VK_PLAY, VK_ZOOM, + VK_NONAME, VK_PA1, + 0 /* End of List */ }; static byte ignore_key_list[] = { -VK_ESCAPE,VK_TAB,VK_SPACE, -'F','W','O','H', /* these are menu characters.*/ -VK_SHIFT,VK_CONTROL,VK_MENU,VK_LWIN,VK_RWIN, -VK_LSHIFT,VK_RSHIFT,VK_LCONTROL,VK_RCONTROL,VK_LMENU,VK_RMENU,0 + VK_ESCAPE, VK_TAB, VK_SPACE, + 'F', 'W', 'O', /*'H',*/ /* these are menu characters.*/ + VK_SHIFT, VK_CONTROL, VK_MENU, VK_LWIN, VK_RWIN, + VK_LSHIFT, VK_RSHIFT, VK_LCONTROL, VK_RCONTROL, + VK_LMENU, VK_RMENU, + 0 /* End of List */ }; - #else /* * Hack -- initialization list for "special_key" @@ -651,7 +690,6 @@ static byte special_key_list[] = VK_INSERT, /* 0x2D (KP<0>) */ VK_DELETE, /* 0x2E (KP<.>) */ VK_HELP, /* 0x2F (?????) */ - #if 0 VK_NUMPAD0, /* 0x60 (KP<0>) */ VK_NUMPAD1, /* 0x61 (KP<1>) */ @@ -670,7 +708,6 @@ static byte special_key_list[] = VK_DECIMAL, /* 0x6E (KP<.>) */ VK_DIVIDE, /* 0x6F (KP) */ #endif - VK_F1, /* 0x70 */ VK_F2, /* 0x71 */ VK_F3, /* 0x72 */ @@ -695,13 +732,12 @@ static byte special_key_list[] = VK_F22, /* 0x85 */ VK_F23, /* 0x86 */ VK_F24, /* 0x87 */ - 0 }; #endif /* bg */ -static void delete_bg() +static void delete_bg(void) { if (hBG != NULL) { @@ -710,7 +746,7 @@ static void delete_bg() } } -static int init_bg() +static int init_bg(void) { char * bmfile = bg_bitmap_file; @@ -719,7 +755,11 @@ static int init_bg() hBG = LoadImage(NULL, bmfile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); if (!hBG) { +#ifdef JP plog_fmt("ÊÉ»æÍÑ¥Ó¥Ã¥È¥Þ¥Ã¥× '%s' ¤òÆɤ߹þ¤á¤Þ¤»¤ó¡£", bmfile); +#else + plog_fmt("Can't load the bitmap file '%s'.", bmfile); +#endif use_bg = 0; return 0; } @@ -729,15 +769,15 @@ static int init_bg() int i, j; delete_bg(); - + wnddc = GetDC(hwnd); dcimage = CreateCompatibleDC(wnddc); dcbg = CreateCompatibleDC(wnddc); - + bmimage = LoadImage(NULL, "bg.bmp", LR_LOADFROMFILE, 0, 0, 0); if (!bmimage) quit("bg.bmp¤¬Æɤߤ³¤á¤Ê¤¤¡ª"); bmimage_old = SelectObject(dcimage, bmimage); - + CreateCompatibleBitmap(); ReleaseDC(hwnd, wnddc); @@ -781,6 +821,7 @@ static void DrawBG(HDC hdc, RECT *r) DeleteDC(hdcSrc); } +#if 0 /* * Hack -- given a pathname, point at the filename */ @@ -797,6 +838,7 @@ static cptr extract_file_name(cptr s) /* Return file name */ return (p+1); } +#endif /* @@ -804,7 +846,7 @@ static cptr extract_file_name(cptr s) * * Return a pointer to a static buffer holding the capitalized base name. */ -#ifndef JP +#if 0 /* #ifndef JP */ static char *analyze_font(char *path, int *wp, int *hp) { int wid, hgt; @@ -828,7 +870,7 @@ static char *analyze_font(char *path, int *wp, int *hp) } /* Find first 'X' */ - s = strchr(p, 'X'); + s = my_strchr(p, 'X'); /* Extract font width */ wid = atoi(p); @@ -1046,29 +1088,42 @@ static void term_getsize(term_data *td) /* * Write the "prefs" for a single term */ -static void save_prefs_aux(term_data *td, cptr sec_name) +static void save_prefs_aux(int i) { + term_data *td = &data[i]; + char sec_name[128]; char buf[1024]; RECT rc; + WINDOWPLACEMENT lpwndpl; /* Paranoia */ if (!td->w) return; + /* Make section name */ + sprintf(sec_name, "Term-%d", i); + /* Visible */ - strcpy(buf, td->visible ? "1" : "0"); - WritePrivateProfileString(sec_name, "Visible", buf, ini_file); + if (i > 0) + { + strcpy(buf, td->visible ? "1" : "0"); + WritePrivateProfileString(sec_name, "Visible", buf, ini_file); + } /* Font */ #ifdef JP strcpy(buf, td->lf.lfFaceName[0]!='\0' ? td->lf.lfFaceName : "£Í£Ó ¥´¥·¥Ã¥¯"); #else +#if 0 strcpy(buf, td->font_file ? td->font_file : "8X13.FON"); +#else + strcpy(buf, td->lf.lfFaceName[0]!='\0' ? td->lf.lfFaceName : "Courier"); +#endif #endif WritePrivateProfileString(sec_name, "Font", buf, ini_file); -#ifdef JP +#if 1 /* #ifdef JP */ wsprintf(buf, "%d", td->lf.lfWidth); WritePrivateProfileString(sec_name, "FontWid", buf, ini_file); wsprintf(buf, "%d", td->lf.lfHeight); @@ -1088,14 +1143,30 @@ static void save_prefs_aux(term_data *td, cptr sec_name) wsprintf(buf, "%d", td->tile_hgt); WritePrivateProfileString(sec_name, "TileHgt", buf, ini_file); + /* Get window placement and dimensions */ + lpwndpl.length = sizeof(WINDOWPLACEMENT); + GetWindowPlacement(td->w, &lpwndpl); + + /* Acquire position in *normal* mode (not minimized) */ + rc = lpwndpl.rcNormalPosition; + /* Window size (x) */ - wsprintf(buf, "%d", td->cols); + if (i == 0) wsprintf(buf, "%d", normsize.x); + else wsprintf(buf, "%d", td->cols); WritePrivateProfileString(sec_name, "NumCols", buf, ini_file); /* Window size (y) */ - wsprintf(buf, "%d", td->rows); + if (i == 0) wsprintf(buf, "%d", normsize.y); + else wsprintf(buf, "%d", td->rows); WritePrivateProfileString(sec_name, "NumRows", buf, ini_file); + /* Maxmized (only main window) */ + if (i == 0) + { + strcpy(buf, IsZoomed(td->w) ? "1" : "0"); + WritePrivateProfileString(sec_name, "Maximized", buf, ini_file); + } + /* Acquire position */ GetWindowRect(td->w, &rc); @@ -1108,8 +1179,11 @@ static void save_prefs_aux(term_data *td, cptr sec_name) WritePrivateProfileString(sec_name, "PositionY", buf, ini_file); /* Window Z position */ - strcpy(buf, td->posfix ? "1" : "0"); - WritePrivateProfileString(sec_name, "PositionFix", buf, ini_file); + if (i > 0) + { + strcpy(buf, td->posfix ? "1" : "0"); + WritePrivateProfileString(sec_name, "PositionFix", buf, ini_file); + } } @@ -1145,11 +1219,7 @@ static void save_prefs(void) /* Save window prefs */ for (i = 0; i < MAX_TERM_DATA; ++i) { - term_data *td = &data[i]; - - sprintf(buf, "Term-%d", i); - - save_prefs_aux(td, buf); + save_prefs_aux(i); } } @@ -1157,20 +1227,35 @@ static void save_prefs(void) /* * Load the "prefs" for a single term */ -static void load_prefs_aux(term_data *td, cptr sec_name) +static void load_prefs_aux(int i) { + term_data *td = &data[i]; + char sec_name[128]; char tmp[1024]; int wid, hgt; + /* Make section name */ + sprintf(sec_name, "Term-%d", i); + + /* Make section name */ + sprintf(sec_name, "Term-%d", i); + /* Visible */ - td->visible = (GetPrivateProfileInt(sec_name, "Visible", td->visible, ini_file) != 0); + if (i > 0) + { + td->visible = (GetPrivateProfileInt(sec_name, "Visible", td->visible, ini_file) != 0); + } /* Desired font, with default */ #ifdef JP GetPrivateProfileString(sec_name, "Font", "£Í£Ó ¥´¥·¥Ã¥¯", tmp, 127, ini_file); #else +#if 0 GetPrivateProfileString(sec_name, "Font", "8X13.FON", tmp, 127, ini_file); +#else + GetPrivateProfileString(sec_name, "Font", "Courier", tmp, 127, ini_file); +#endif #endif @@ -1178,7 +1263,7 @@ static void load_prefs_aux(term_data *td, cptr sec_name) td->bizarre = (GetPrivateProfileInt(sec_name, "Bizarre", td->bizarre, ini_file) != 0); /* Analyze font, save desired font name */ -#ifdef JP +#if 1 /* #ifdef JP */ td->font_want = string_make(tmp); hgt = 15; wid = 0; td->lf.lfWidth = GetPrivateProfileInt(sec_name, "FontWid", wid, ini_file); @@ -1190,7 +1275,7 @@ static void load_prefs_aux(term_data *td, cptr sec_name) /* Tile size */ -#ifdef JP +#if 1 /* #ifdef JP */ td->tile_wid = GetPrivateProfileInt(sec_name, "TileWid", td->lf.lfWidth, ini_file); td->tile_hgt = GetPrivateProfileInt(sec_name, "TileHgt", td->lf.lfHeight, ini_file); #else @@ -1202,13 +1287,23 @@ static void load_prefs_aux(term_data *td, cptr sec_name) /* Window size */ td->cols = GetPrivateProfileInt(sec_name, "NumCols", td->cols, ini_file); td->rows = GetPrivateProfileInt(sec_name, "NumRows", td->rows, ini_file); + normsize.x = td->cols; normsize.y = td->rows; + + /* Window size */ + if (i == 0) + { + win_maximized = GetPrivateProfileInt(sec_name, "Maximized", win_maximized, ini_file); + } /* Window position */ td->pos_x = GetPrivateProfileInt(sec_name, "PositionX", td->pos_x, ini_file); td->pos_y = GetPrivateProfileInt(sec_name, "PositionY", td->pos_y, ini_file); /* Window Z position */ - td->posfix = GetPrivateProfileInt(sec_name, "PositionFix", td->posfix, ini_file); + if (i > 0) + { + td->posfix = GetPrivateProfileInt(sec_name, "PositionFix", td->posfix, ini_file); + } } @@ -1219,8 +1314,6 @@ static void load_prefs(void) { int i; - char buf[1024]; - /* Extract the "arg_graphics" flag */ arg_graphics = GetPrivateProfileInt("Angband", "Graphics", GRAPHICS_NONE, ini_file); @@ -1238,14 +1331,92 @@ static void load_prefs(void) /* Load window prefs */ for (i = 0; i < MAX_TERM_DATA; ++i) { - term_data *td = &data[i]; + load_prefs_aux(i); + } +} + +#ifdef USE_SOUND + +/* + * XXX XXX XXX - Taken from files.c. + * + * Extract "tokens" from a buffer + * + * This function uses "whitespace" as delimiters, and treats any amount of + * whitespace as a single delimiter. We will never return any empty tokens. + * When given an empty buffer, or a buffer containing only "whitespace", we + * will return no tokens. We will never extract more than "num" tokens. + * + * By running a token through the "text_to_ascii()" function, you can allow + * that token to include (encoded) whitespace, using "\s" to encode spaces. + * + * We save pointers to the tokens in "tokens", and return the number found. + */ +static s16b tokenize_whitespace(char *buf, s16b num, char **tokens) +{ + int k = 0; - sprintf(buf, "Term-%d", i); + char *s = buf; - load_prefs_aux(td, buf); + + /* Process */ + while (k < num) + { + char *t; + + /* Skip leading whitespace */ + for ( ; *s && isspace(*s); ++s) /* loop */; + + /* All done */ + if (!*s) break; + + /* Find next whitespace, if any */ + for (t = s; *t && !isspace(*t); ++t) /* loop */; + + /* Nuke and advance (if necessary) */ + if (*t) *t++ = '\0'; + + /* Save the token */ + tokens[k++] = s; + + /* Advance */ + s = t; } + + /* Count */ + return (k); } +static void load_sound_prefs(void) +{ + int i, j, num; + char tmp[1024]; + char ini_path[1024]; + char wav_path[1024]; + char *zz[SAMPLE_MAX]; + + /* Access the sound.cfg */ + path_build(ini_path, 1024, ANGBAND_DIR_XTRA_SOUND, "sound.cfg"); + + for (i = 0; i < SOUND_MAX; i++) + { + GetPrivateProfileString("Sound", angband_sound_name[i], "", tmp, 1024, ini_path); + + num = tokenize_whitespace(tmp, SAMPLE_MAX, zz); + + for (j = 0; j < num; j++) + { + /* Access the sound */ + path_build(wav_path, 1024, ANGBAND_DIR_XTRA_SOUND, zz[j]); + + /* Save the sound filename, if it exists */ + if (check_file(wav_path)) + sound_file[i][j] = string_make(zz[j]); + } + } +} + +#endif /* USE_SOUND */ /* * Create the new global palette based on the bitmap palette @@ -1449,8 +1620,6 @@ static bool init_graphics(void) infGraph.CellWidth = wid; infGraph.CellHeight = hgt; -#ifdef USE_TRANSPARENCY - if (arg_graphics == GRAPHICS_ADAM_BOLT) { /* Access the mask file */ @@ -1464,8 +1633,6 @@ static bool init_graphics(void) } } -#endif /* USE_TRANSPARENCY */ - /* Activate a palette */ if (!new_palette()) { @@ -1500,23 +1667,8 @@ static bool init_sound(void) /* Initialize once */ if (!can_use_sound) { - int i; - - char wav[128]; - char buf[1024]; - - /* Prepare the sounds */ - for (i = 1; i < SOUND_MAX; i++) - { - /* Extract name of sound file */ - sprintf(wav, "%s.wav", angband_sound_name[i]); - - /* Access the sound */ - path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_SOUND, wav); - - /* Save the sound filename, if it exists */ - if (check_file(buf)) sound_file[i] = string_make(buf); - } + /* Load the prefs */ + load_sound_prefs(); /* Sound available */ can_use_sound = TRUE; @@ -1559,7 +1711,7 @@ static errr term_force_font(term_data *td, cptr path) { int wid, hgt; -#ifndef JP +#if 0 /* #ifndef JP */ int i; char *base; char buf[1024]; @@ -1568,7 +1720,16 @@ static errr term_force_font(term_data *td, cptr path) /* Forget the old font (if needed) */ if (td->font_id) DeleteObject(td->font_id); -#ifndef JP +#if 1 /* #ifdef JP */ + /* Unused */ + (void)path; + + /* Create the font (using the 'base' of the font file name!) */ + td->font_id = CreateFontIndirect(&(td->lf)); + wid = td->lf.lfWidth; + hgt = td->lf.lfHeight; + if (!td->font_id) return (1); +#else /* Forget old font */ if (td->font_file) { @@ -1599,11 +1760,9 @@ static errr term_force_font(term_data *td, cptr path) td->font_file = NULL; } - /* No path given */ if (!path) return (1); - /* Local copy */ strcpy(buf, path); @@ -1624,22 +1783,14 @@ static errr term_force_font(term_data *td, cptr path) /* Remove the "suffix" */ base[strlen(base)-4] = '\0'; -#endif /* Create the font (using the 'base' of the font file name!) */ -#ifdef JP - td->font_id = CreateFontIndirect(&(td->lf)); - wid = td->lf.lfWidth; - hgt = td->lf.lfHeight; - if (!td->font_id) return (1); -#else td->font_id = CreateFont(hgt, wid, 0, 0, FW_DONTCARE, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH | FF_DONTCARE, base); #endif - /* Hack -- Unknown size */ if (!wid || !hgt) { @@ -1674,7 +1825,7 @@ static errr term_force_font(term_data *td, cptr path) */ static void term_change_font(term_data *td) { -#ifdef JP +#if 1 /* #ifdef JP */ CHOOSEFONT cf; memset(&cf, 0, sizeof(cf)); @@ -1786,6 +1937,28 @@ static void term_data_redraw(term_data *td) } +void Term_inversed_area(HWND hWnd, int x, int y, int w, int h) +{ + HDC hdc; + HPEN oldPen; + HBRUSH myBrush, oldBrush; + + term_data *td = (term_data *)GetWindowLong(hWnd, 0); + int tx = td->size_ow1 + x * td->tile_wid; + int ty = td->size_oh1 + y * td->tile_hgt; + int tw = w * td->tile_wid - 1; + int th = h * td->tile_hgt - 1; + + hdc = GetDC(hWnd); + myBrush = CreateSolidBrush(RGB(255, 255, 255)); + oldBrush = SelectObject(hdc, myBrush); + oldPen = SelectObject(hdc, GetStockObject(NULL_PEN) ); + + PatBlt(hdc, tx, ty, tw, th, PATINVERT); + + SelectObject(hdc, oldBrush); + SelectObject(hdc, oldPen); +} @@ -1819,6 +1992,9 @@ static void Term_nuke_win(term *t) */ static errr Term_user_win(int n) { + /* Unused */ + (void)n; + /* Success */ return (0); } @@ -1948,7 +2124,7 @@ static errr Term_xtra_win_react(void) term_data *td = &data[i]; /* Update resized windows */ - if ((td->cols != td->t.wid) || (td->rows != td->t.hgt)) + if ((td->cols != (uint)td->t.wid) || (td->rows != (uint)td->t.hgt)) { /* Activate */ Term_activate(&td->t); @@ -2075,6 +2251,11 @@ static errr Term_xtra_win_noise(void) */ static errr Term_xtra_win_sound(int v) { +#ifdef USE_SOUND + int i; + char buf[1024]; +#endif /* USE_SOUND */ + /* Sound disabled */ if (!use_sound) return (1); @@ -2083,18 +2264,28 @@ static errr Term_xtra_win_sound(int v) #ifdef USE_SOUND - /* Unknown sound */ - if (!sound_file[v]) return (1); + /* Count the samples */ + for (i = 0; i < SAMPLE_MAX; i++) + { + if (!sound_file[v][i]) + break; + } + + /* No sample */ + if (i == 0) return (1); + + /* Build the path */ + path_build(buf, 1024, ANGBAND_DIR_XTRA_SOUND, sound_file[v][Rand_simple(i)]); #ifdef WIN32 /* Play the sound, catch errors */ - return (PlaySound(sound_file[v], 0, SND_FILENAME | SND_ASYNC)); + return (PlaySound(buf, 0, SND_FILENAME | SND_ASYNC)); #else /* WIN32 */ /* Play the sound, catch errors */ - return (sndPlaySound(sound_file[v], SND_ASYNC)); + return (sndPlaySound(buf, SND_ASYNC)); #endif /* WIN32 */ @@ -2340,8 +2531,7 @@ static errr Term_text_win(int x, int y, int n, byte a, const char *s) RECT rc; HDC hdc; - -#ifdef JP +#if 1 /* #ifdef JP */ static HBITMAP WALL; static HBRUSH myBrush, oldBrush; static HPEN oldPen; @@ -2455,6 +2645,29 @@ static errr Term_text_win(int x, int y, int n, byte a, const char *s) rc.right += td->tile_wid; } else { /* Dump the text */ + ExtTextOut(hdc, rc.left, rc.top, ETO_CLIPPED, &rc, s+i, 1, NULL); + + /* Advance */ + rc.left += td->tile_wid; + rc.right += td->tile_wid; + } +#else +#if 1 + if (*(s+i)==127){ + oldBrush = SelectObject(hdc, myBrush); + oldPen = SelectObject(hdc, GetStockObject(NULL_PEN) ); + + /* Dump the wall */ + Rectangle(hdc, rc.left, rc.top, rc.right+1, rc.bottom+1); + + SelectObject(hdc, oldBrush); + SelectObject(hdc, oldPen); + + /* Advance */ + rc.left += td->tile_wid; + rc.right += td->tile_wid; + } else { + /* Dump the text */ ExtTextOut(hdc, rc.left, rc.top, ETO_CLIPPED, &rc, s+i, 1, NULL); @@ -2471,6 +2684,7 @@ static errr Term_text_win(int x, int y, int n, byte a, const char *s) rc.left += td->tile_wid; rc.right += td->tile_wid; #endif +#endif } } @@ -2504,11 +2718,7 @@ static errr Term_text_win(int x, int y, int n, byte a, const char *s) * * If "graphics" is not available, we simply "wipe" the given grids. */ -# ifdef USE_TRANSPARENCY static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp) -# else /* USE_TRANSPARENCY */ -static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp) -# endif /* USE_TRANSPARENCY */ { term_data *td = (term_data*)(Term->data); @@ -2517,15 +2727,10 @@ static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp) int i; int x1, y1, w1, h1; int x2, y2, w2, h2, tw2; - -# ifdef USE_TRANSPARENCY - int x3, y3; HDC hdcMask; -# endif /* USE_TRANSPARENCY */ - HDC hdc; HDC hdcSrc; HBITMAP hbmSrcOld; @@ -2568,16 +2773,12 @@ static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp) hdcSrc = CreateCompatibleDC(hdc); hbmSrcOld = SelectObject(hdcSrc, infGraph.hBitmap); -# ifdef USE_TRANSPARENCY - if (arg_graphics == GRAPHICS_ADAM_BOLT) { hdcMask = CreateCompatibleDC(hdc); SelectObject(hdcMask, infMask.hBitmap); } -# endif /* USE_TRANSPARENCY */ - /* Draw attr/char pairs */ for (i = 0; i < n; i++, x2 += w2) { @@ -2592,8 +2793,6 @@ static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp) x1 = col * w1; y1 = row * h1; -# ifdef USE_TRANSPARENCY - if (arg_graphics == GRAPHICS_ADAM_BOLT) { x3 = (tcp[i] & 0x7F) * w1; @@ -2633,9 +2832,6 @@ static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp) } } else - -# endif /* USE_TRANSPARENCY */ - { /* Perfect size */ if ((w1 == tw2) && (h1 == h2)) @@ -2660,8 +2856,6 @@ static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp) SelectObject(hdcSrc, hbmSrcOld); DeleteDC(hdcSrc); -# ifdef USE_TRANSPARENCY - if (arg_graphics == GRAPHICS_ADAM_BOLT) { /* Release */ @@ -2669,8 +2863,6 @@ static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp) DeleteDC(hdcMask); } -# endif /* USE_TRANSPARENCY */ - /* Release */ ReleaseDC(td->w, hdc); @@ -2693,9 +2885,7 @@ static void windows_map(void) int x, min_x, max_x; int y, min_y, max_y; -#ifdef USE_TRANSPARENCY byte ta, tc; -#endif /* Only in graphics mode */ if (!use_graphics) return; @@ -2719,20 +2909,12 @@ static void windows_map(void) { for (y = min_y; y < max_y; y++) { -#ifdef USE_TRANSPARENCY map_info(y, x, &a, (char*)&c, &ta, (char*)&tc); -#else /* USE_TRANSPARENCY */ - map_info(y, x, &a, (char*)&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 */ } } } @@ -2811,7 +2993,7 @@ static void init_windows(void) term_data *td; -#ifndef JP +#if 0 /* #ifndef JP */ char buf[1024]; #endif @@ -2835,8 +3017,7 @@ static void init_windows(void) td->pos_x = 7 * 30; td->pos_y = 7 * 20; td->posfix = FALSE; - -#ifdef JP +#if 1 /* #ifdef JP */ td->bizarre = TRUE; #endif /* Sub windows */ @@ -2856,7 +3037,7 @@ static void init_windows(void) td->pos_x = (7 - i) * 30; td->pos_y = (7 - i) * 20; td->posfix = FALSE; -#ifdef JP +#if 1 /* #ifdef JP */ td->bizarre = TRUE; #endif } @@ -2888,9 +3069,9 @@ static void init_windows(void) { td = &data[i]; -#ifdef JP +#if 1 /* #ifdef JP */ strncpy(td->lf.lfFaceName, td->font_want, LF_FACESIZE); - td->lf.lfCharSet = SHIFTJIS_CHARSET; + td->lf.lfCharSet = DEFAULT_CHARSET; td->lf.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE; /* Activate the chosen font */ term_force_font(td, NULL); @@ -2993,9 +3174,12 @@ static void init_windows(void) term_data_link(td); angband_term[0] = &td->t; + normsize.x = td->cols; + normsize.y = td->rows; /* Activate the main window */ - SetActiveWindow(td->w); + if (win_maximized) ShowWindow(td->w, SW_SHOWMAXIMIZED); + else ShowWindow(td->w, SW_SHOW); /* Bring main window back to top */ SetWindowPos(td->w, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); @@ -3485,6 +3669,49 @@ static void process_menus(WORD wCmd) break; } + /* Open game */ + case IDM_FILE_MOVIE: + { + if (!initialized) + { +#ifdef JP + plog("¤Þ¤À½é´ü²½Ãæ¤Ç¤¹..."); +#else + plog("You cannot do that yet..."); +#endif + } + else if (game_in_progress) + { +#ifdef JP + plog("¥×¥ì¥¤Ãæ¤Ï¥à¡¼¥Ó¡¼¤ò¥í¡¼¥É¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¡ª"); +#else + plog("You can't open a movie while you're playing!"); +#endif + } + else + { + memset(&ofn, 0, sizeof(ofn)); + ofn.lStructSize = sizeof(ofn); + ofn.hwndOwner = data[0].w; + ofn.lpstrFilter = "Angband Movie Files (*.amv)\0*.amv\0"; + ofn.nFilterIndex = 1; + ofn.lpstrFile = savefile; + ofn.nMaxFile = 1024; + ofn.lpstrInitialDir = ANGBAND_DIR_USER; + ofn.Flags = OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR; + + if (GetOpenFileName(&ofn)) + { + /* Load 'savefile' */ + prepare_browse_movie_aux(savefile); + play_game(FALSE); + quit(NULL); + return; + } + } + break; + } + case IDM_WINDOW_VIS_0: { @@ -4008,6 +4235,96 @@ static void process_menus(WORD wCmd) } +static bool process_keydown(WPARAM wParam, LPARAM lParam) +{ + int i; + bool mc = FALSE; + bool ms = FALSE; + bool ma = FALSE; + + /* Extract the modifiers */ + if (GetKeyState(VK_CONTROL) & 0x8000) mc = TRUE; + if (GetKeyState(VK_SHIFT) & 0x8000) ms = TRUE; + if (GetKeyState(VK_MENU) & 0x8000) ma = TRUE; + + Term_no_press = (ma) ? TRUE : FALSE; + + /* Handle "special" keys */ + if (special_key[(byte)(wParam)] || (ma && !ignore_key[(byte)(wParam)]) ) + { + bool ext_key = (lParam & 0x1000000L) ? TRUE : FALSE; + bool numpad = FALSE; + + /* Begin the macro trigger */ + Term_keypress(31); + + /* Send the modifiers */ + if (mc) Term_keypress('C'); + if (ms) Term_keypress('S'); + if (ma) Term_keypress('A'); + + /* Extract "scan code" */ + i = LOBYTE(HIWORD(lParam)); + + /* Introduce the scan code */ + Term_keypress('x'); + + /* Extended key bit */ + switch (wParam) + { + /* Numpad Enter and '/' are extended key */ + case VK_DIVIDE: + Term_no_press = TRUE; + case VK_RETURN: /* Enter */ + numpad = ext_key; + break; + /* Other extended keys are on full keyboard */ + case VK_NUMPAD0: + case VK_NUMPAD1: + case VK_NUMPAD2: + case VK_NUMPAD3: + case VK_NUMPAD4: + case VK_NUMPAD5: + case VK_NUMPAD6: + case VK_NUMPAD7: + case VK_NUMPAD8: + case VK_NUMPAD9: + case VK_ADD: + case VK_MULTIPLY: + case VK_SUBTRACT: + case VK_SEPARATOR: + case VK_DECIMAL: + Term_no_press = TRUE; + case VK_CLEAR: + case VK_HOME: + case VK_END: + case VK_PRIOR: /* Page Up */ + case VK_NEXT: /* Page Down */ + case VK_INSERT: + case VK_DELETE: + case VK_UP: + case VK_DOWN: + case VK_LEFT: + case VK_RIGHT: + numpad = !ext_key; + } + + /* Special modifiers for keypad keys */ + if (numpad) Term_keypress('K'); + + /* Encode the hexidecimal scan code */ + Term_keypress(hexsym[i/16]); + Term_keypress(hexsym[i%16]); + + /* End the macro trigger */ + Term_keypress(13); + + return 1; + } + + return 0; +} + #ifdef __MWERKS__ LRESULT FAR PASCAL AngbandWndProc(HWND hWnd, UINT uMsg, @@ -4085,48 +4402,133 @@ LRESULT FAR PASCAL AngbandWndProc(HWND hWnd, UINT uMsg, case WM_SYSKEYDOWN: case WM_KEYDOWN: { - bool mc = FALSE; - bool ms = FALSE; - bool ma = FALSE; + if (process_keydown(wParam, lParam)) + return 0; + break; + } + + case WM_CHAR: + { + if (Term_no_press) Term_no_press = FALSE; + else Term_keypress(wParam); + return 0; + } - /* Extract the modifiers */ - if (GetKeyState(VK_CONTROL) & 0x8000) mc = TRUE; - if (GetKeyState(VK_SHIFT) & 0x8000) ms = TRUE; - if (GetKeyState(VK_MENU) & 0x8000) ma = TRUE; + case WM_LBUTTONDOWN: + { + mousex = MIN(LOWORD(lParam) / td->tile_wid, td->cols - 1); + mousey = MIN(HIWORD(lParam) / td->tile_hgt, td->rows - 1); + mouse_down = TRUE; + oldx = mousex; + oldy = mousey; + return 0; + } - /* Handle "special" keys */ - if (special_key[(byte)(wParam)] || (ma && !ignore_key[(byte)(wParam)]) ) - { - /* Begin the macro trigger */ - Term_keypress(31); + case WM_LBUTTONUP: + { + HGLOBAL hGlobal; + LPSTR lpStr; + int i, j, sz; + int dx = abs(oldx - mousex) + 1; + int dy = abs(oldy - mousey) + 1; + int ox = (oldx > mousex) ? mousex : oldx; + int oy = (oldy > mousey) ? mousey : oldy; - /* Send the modifiers */ - if (mc) Term_keypress('C'); - if (ms) Term_keypress('S'); - if (ma) Term_keypress('A'); + mouse_down = FALSE; + paint_rect = FALSE; - /* Extract "scan code" */ - i = LOBYTE(HIWORD(lParam)); +#ifdef JP + sz = (dx + 3) * dy; +#else + sz = (dx + 2) * dy; +#endif + hGlobal = GlobalAlloc(GHND, sz + 1); + if (hGlobal == NULL) return 0; + lpStr = (LPSTR)GlobalLock(hGlobal); - /* Introduce the scan code */ - Term_keypress('x'); + for (i = 0; i < dy; i++) + { +#ifdef JP + char *s; + char **scr = data[0].t.scr->c; + + C_MAKE(s, (dx + 1), char); + strncpy(s, &scr[oy + i][ox], dx); - /* Encode the hexidecimal scan code */ - Term_keypress(hexsym[i/16]); - Term_keypress(hexsym[i%16]); + if (ox > 0) + { + if (iskanji(scr[oy + i][ox - 1])) s[0] = ' '; + } - /* End the macro trigger */ - Term_keypress(13); + if (ox + dx < data[0].cols) + { + if (iskanji(scr[oy + i][ox + dx - 1])) s[dx - 1] = ' '; + } + for (j = 0; j < dx; j++) + { + if (s[j] == 127) s[j] = '#'; + *lpStr++ = s[j]; + } +#else + for (j = 0; j < dx; j++) + { + *lpStr++ = data[0].t.scr->c[oy + i][ox + j]; + } +#endif + if (dy > 1) + { + *lpStr++ = '\r'; + *lpStr++ = '\n'; + } + } + + GlobalUnlock(hGlobal); + if (OpenClipboard(hWnd) == 0) + { + GlobalFree(hGlobal); return 0; } + EmptyClipboard(); + SetClipboardData(CF_TEXT, hGlobal); + CloseClipboard(); - break; + Term_redraw(); + + return 0; } - case WM_CHAR: + case WM_MOUSEMOVE: { - Term_keypress(wParam); + if (mouse_down) + { + int dx, dy; + int cx = MIN(LOWORD(lParam) / td->tile_wid, td->cols - 1); + int cy = MIN(HIWORD(lParam) / td->tile_hgt, td->rows - 1); + int ox, oy; + + if (paint_rect) + { + dx = abs(oldx - mousex) + 1; + dy = abs(oldy - mousey) + 1; + ox = (oldx > mousex) ? mousex : oldx; + oy = (oldy > mousey) ? mousey : oldy; + Term_inversed_area(hWnd, ox, oy, dx, dy); + } + else + { + paint_rect = TRUE; + } + + dx = abs(cx - mousex) + 1; + dy = abs(cy - mousey) + 1; + ox = (cx > mousex) ? mousex : cx; + oy = (cy > mousey) ? mousey : cy; + Term_inversed_area(hWnd, ox, oy, dx, dy); + + oldx = cx; + oldy = cy; + } return 0; } @@ -4163,13 +4565,49 @@ LRESULT FAR PASCAL AngbandWndProc(HWND hWnd, UINT uMsg, #else /* ZANGBAND */ /* do_cmd_save_game(); */ #endif /* ZANGBAND */ - Term_key_push(252); + Term_key_push(SPECIAL_KEY_QUIT); return 0; } quit(NULL); return 0; } + case WM_QUERYENDSESSION: + { + if (game_in_progress && character_generated) + { + /* Hack -- Forget messages */ + msg_flag = FALSE; + + /* Mega-Hack -- Delay death */ + if (p_ptr->chp < 0) p_ptr->is_dead = FALSE; + +#ifdef JP + do_cmd_write_nikki(NIKKI_GAMESTART, 0, "----¥²¡¼¥àÃæÃÇ----"); +#else + do_cmd_write_nikki(NIKKI_GAMESTART, 0, "---- Save and Exit Game ----"); +#endif + + /* Hardcode panic save */ + p_ptr->panic_save = 1; + + /* Forbid suspend */ + signals_ignore_tstp(); + + /* Indicate panic save */ +#ifdef JP + (void)strcpy(p_ptr->died_from, "(¶ÛµÞ¥»¡¼¥Ö)"); +#else + (void)strcpy(p_ptr->died_from, "(panic save)"); +#endif + + /* Panic save */ + (void)save_player(); + } + quit(NULL); + return 0; + } + case WM_QUIT: { quit(NULL); @@ -4222,6 +4660,12 @@ LRESULT FAR PASCAL AngbandWndProc(HWND hWnd, UINT uMsg, td->cols = cols; td->rows = rows; + if (!IsZoomed(td->w) && !IsIconic(td->w)) + { + normsize.x = td->cols; + normsize.y = td->rows; + } + /* Activate */ Term_activate(&td->t); @@ -4295,6 +4739,8 @@ LRESULT FAR PASCAL AngbandWndProc(HWND hWnd, UINT uMsg, case WM_ACTIVATEAPP: { + if (IsIconic(td->w)) break; + for (i = 1; i < MAX_TERM_DATA; i++) { if(data[i].visible) @@ -4442,48 +4888,15 @@ LRESULT FAR PASCAL AngbandListProc(HWND hWnd, UINT uMsg, case WM_SYSKEYDOWN: case WM_KEYDOWN: { - bool mc = FALSE; - bool ms = FALSE; - bool ma = FALSE; - - /* Extract the modifiers */ - if (GetKeyState(VK_CONTROL) & 0x8000) mc = TRUE; - if (GetKeyState(VK_SHIFT) & 0x8000) ms = TRUE; - if (GetKeyState(VK_MENU) & 0x8000) ma = TRUE; - - /* Handle "special" keys */ - if (special_key[(byte)(wParam)] || (ma && !ignore_key[(byte)(wParam)]) ) - { - /* Begin the macro trigger */ - Term_keypress(31); - - /* Send the modifiers */ - if (mc) Term_keypress('C'); - if (ms) Term_keypress('S'); - if (ma) Term_keypress('A'); - - /* Extract "scan code" */ - i = LOBYTE(HIWORD(lParam)); - - /* Introduce the scan code */ - Term_keypress('x'); - - /* Encode the hexidecimal scan code */ - Term_keypress(hexsym[i/16]); - Term_keypress(hexsym[i%16]); - - /* End the macro trigger */ - Term_keypress(13); - + if (process_keydown(wParam, lParam)) return 0; - } - break; } case WM_CHAR: { - Term_keypress(wParam); + if (Term_no_press) Term_no_press = FALSE; + else Term_keypress(wParam); return 0; } @@ -4746,10 +5159,8 @@ static void hook_quit(cptr str) if (infGraph.hPalette) DeleteObject(infGraph.hPalette); if (infGraph.hBitmap) DeleteObject(infGraph.hBitmap); -#ifdef USE_TRANSPARENCY if (infMask.hPalette) DeleteObject(infMask.hPalette); if (infMask.hBitmap) DeleteObject(infMask.hBitmap); -#endif /* USE_TRANSPARENCY */ #endif /* USE_GRAPHICS */ @@ -4854,7 +5265,7 @@ static void init_stuff(void) validate_file(path); -#ifndef JP +#if 0 /* #ifndef JP */ /* Build the "font" path */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA, "font"); @@ -4932,6 +5343,9 @@ int FAR PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, HDC hdc; MSG msg; + /* Unused */ + (void)nCmdShow; + /* Save globally */ hInstance = hInst; @@ -5047,13 +5461,14 @@ int FAR PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, } } + /* Catch nasty signals */ + signals_init(); /* Initialize */ init_angband(); /* We are now initialized */ initialized = TRUE; - #ifdef CHUUKEI if(lpCmdLine[0] == '-'){ switch(lpCmdLine[1]) @@ -5082,6 +5497,15 @@ int FAR PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, quit(NULL); return 0; } + case 'X': + case 'x': + { + if (!lpCmdLine[2]) break; + prepare_browse_movie(&lpCmdLine[2]); + play_game(FALSE); + quit(NULL); + return 0; + } } } #endif