OSDN Git Service

dungeon_turnの過剰経過による、NASTY_MONSTER発生率と階層上昇を有効な形に実装し直した上で、若干調整。
[hengband/hengband.git] / src / main-win.c
index 068d886..b698e1b 100644 (file)
@@ -76,7 +76,7 @@
 
 
 #ifdef WINDOWS
-
+#include <windows.h>
 #include <direct.h>
 
 /*
 #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
 #define IDM_WINDOW_FONT_6              216
 #define IDM_WINDOW_FONT_7              217
 
+#define IDM_WINDOW_POS_0               220
+#define IDM_WINDOW_POS_1               221
+#define IDM_WINDOW_POS_2               222
+#define IDM_WINDOW_POS_3               223
+#define IDM_WINDOW_POS_4               224
+#define IDM_WINDOW_POS_5               225
+#define IDM_WINDOW_POS_6               226
+#define IDM_WINDOW_POS_7               227
+
 #define IDM_WINDOW_BIZ_0               230
 #define IDM_WINDOW_BIZ_1               231
 #define IDM_WINDOW_BIZ_2               232
 /*
  * 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
@@ -395,10 +407,12 @@ struct _term_data
        uint map_tile_hgt;
 
        bool map_active;
-#ifdef JP
+#if 1 /* #ifdef JP */
        LOGFONT lf;
 #endif
 
+       bool posfix;
+
 /* bg */
 #if 0
        char *bgfile;
@@ -423,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;
@@ -489,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 */
 
 
@@ -508,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 */
 
@@ -534,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
 
 
 /*
@@ -548,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
@@ -588,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"
@@ -640,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>) */
@@ -659,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 */
@@ -684,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)
        {
@@ -699,7 +746,7 @@ static void delete_bg()
        }
 }
 
-static int init_bg()
+static int init_bg(void)
 {
        char * bmfile = bg_bitmap_file;
 
@@ -708,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;
        }
@@ -718,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);
@@ -770,6 +821,7 @@ static void DrawBG(HDC hdc, RECT *r)
        DeleteDC(hdcSrc);
 }
 
+#if 0
 /*
  * Hack -- given a pathname, point at the filename
  */
@@ -786,6 +838,7 @@ static cptr extract_file_name(cptr s)
        /* Return file name */
        return (p+1);
 }
+#endif
 
 
 /*
@@ -793,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;
@@ -817,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);
@@ -999,12 +1052,6 @@ static void term_getsize(term_data *td)
        if (td->cols < 1) td->cols = 1;
        if (td->rows < 1) td->rows = 1;
 
-#if 0
-       /* Paranoia */
-       if (td->cols > 80) td->cols = 80;
-       if (td->rows > 24) td->rows = 24;
-#endif
-
        /* Window sizes */
        wid = td->cols * td->tile_wid + td->size_ow1 + td->size_ow2;
        hgt = td->rows * td->tile_hgt + td->size_oh1 + td->size_oh2;
@@ -1041,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);
@@ -1083,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);
 
@@ -1101,6 +1177,13 @@ static void save_prefs_aux(term_data *td, cptr sec_name)
        /* Window position (y) */
        wsprintf(buf, "%d", rc.top);
        WritePrivateProfileString(sec_name, "PositionY", buf, ini_file);
+
+       /* Window Z position */
+       if (i > 0)
+       {
+               strcpy(buf, td->posfix ? "1" : "0");
+               WritePrivateProfileString(sec_name, "PositionFix", buf, ini_file);
+       }
 }
 
 
@@ -1136,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);
        }
 }
 
@@ -1148,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
 
 
@@ -1169,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);
@@ -1181,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
@@ -1193,10 +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 */
+       if (i > 0)
+       {
+               td->posfix = GetPrivateProfileInt(sec_name, "PositionFix", td->posfix, ini_file);
+       }
 }
 
 
@@ -1207,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);
 
@@ -1226,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;
+
+       char *s = 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];
 
-               sprintf(buf, "Term-%d", i);
+       /* Access the sound.cfg */
+       path_build(ini_path, 1024, ANGBAND_DIR_XTRA_SOUND, "sound.cfg");
 
-               load_prefs_aux(td, buf);
+       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
@@ -1419,7 +1602,7 @@ static bool init_graphics(void)
                }
 
                /* Access the bitmap file */
-               path_build(buf, 1024, ANGBAND_DIR_XTRA_GRAF, name);
+               path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_GRAF, name);
 
                /* Load the bitmap or quit */
                if (!ReadDIB(data[0].w, buf, &infGraph))
@@ -1437,12 +1620,10 @@ static bool init_graphics(void)
                infGraph.CellWidth = wid;
                infGraph.CellHeight = hgt;
 
-#ifdef USE_TRANSPARENCY
-
                if (arg_graphics == GRAPHICS_ADAM_BOLT)
                {
                        /* Access the mask file */
-                       path_build(buf, 1024, ANGBAND_DIR_XTRA_GRAF, "mask.bmp");
+                       path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_GRAF, "mask.bmp");
 
                        /* Load the bitmap or quit */
                        if (!ReadDIB(data[0].w, buf, &infMask))
@@ -1452,8 +1633,6 @@ static bool init_graphics(void)
                        }
                }
 
-#endif /* USE_TRANSPARENCY */
-
                /* Activate a palette */
                if (!new_palette())
                {
@@ -1488,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, 1024, 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;
@@ -1526,8 +1690,8 @@ static void term_window_resize(term_data *td)
 
        /* Resize the window */
        SetWindowPos(td->w, 0, 0, 0,
-                    td->size_wid, td->size_hgt,
-                    SWP_NOMOVE | SWP_NOZORDER);
+                    td->size_wid, td->size_hgt,
+                    SWP_NOMOVE | SWP_NOZORDER);
 
        /* Redraw later */
        InvalidateRect(td->w, NULL, TRUE);
@@ -1547,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];
@@ -1556,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)
        {
@@ -1587,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);
 
@@ -1612,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);
+                                ANSI_CHARSET, OUT_DEFAULT_PRECIS,
+                                CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
+                                FIXED_PITCH | FF_DONTCARE, base);
 #endif
 
-
        /* Hack -- Unknown size */
        if (!wid || !hgt)
        {
@@ -1662,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));
@@ -1716,7 +1879,7 @@ static void term_change_font(term_data *td)
                if (term_force_font(td, tmp))
                {
                        /* Access the standard font file */
-                       path_build(tmp, 1024, ANGBAND_DIR_XTRA_FONT, "8X13.FON");
+                       path_build(tmp, sizeof(tmp), ANGBAND_DIR_XTRA_FONT, "8X13.FON");
 
                        /* Force the use of that font */
                        (void)term_force_font(td, tmp);
@@ -1739,7 +1902,14 @@ static void term_change_font(term_data *td)
 
 }
 
-
+/*
+ * Allow the user to lock this window.
+ */
+static void term_window_pos(term_data *td, HWND hWnd)
+{
+       SetWindowPos(td->w, hWnd, 0, 0, 0, 0,
+                       SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
+}
 
 static void windows_map(void);
 
@@ -1767,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);
+}
 
 
 
@@ -1800,6 +1992,9 @@ static void Term_nuke_win(term *t)
  */
 static errr Term_user_win(int n)
 {
+       /* Unused */
+       (void)n;
+
        /* Success */
        return (0);
 }
@@ -1929,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);
@@ -2056,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);
 
@@ -2064,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 */
 
@@ -2219,14 +2429,47 @@ static errr Term_curs_win(int x, int y)
        rc.top = y * tile_hgt + td->size_oh1;
        rc.bottom = rc.top + tile_hgt;
 
-#ifdef JP
-       if (x + 1 < Term->wid && 
-           ((use_bigtile && Term->old->a[y][x+1] == 255)
-           || (iskanji(Term->old->c[y][x]) && !(Term->old->a[y][x] & 0x80))))
-#else
-       if (use_bigtile && x + 1 < Term->wid && Term->old->a[y][x+1] == 255)
-#endif
-               rc.right += tile_wid;
+       /* Cursor is done as a yellow "box" */
+       hdc = GetDC(td->w);
+       FrameRect(hdc, &rc, hbrYellow);
+       ReleaseDC(td->w, hdc);
+
+       /* Success */
+       return 0;
+}
+
+
+/*
+ * Low level graphics (Assumes valid input).
+ *
+ * Draw a "big cursor" at (x,y), using a "yellow box".
+ */
+static errr Term_bigcurs_win(int x, int y)
+{
+       term_data *td = (term_data*)(Term->data);
+
+       RECT rc;
+       HDC hdc;
+
+       int tile_wid, tile_hgt;
+
+       if (td->map_active)
+       {
+               /* Normal cursor in map window */
+               Term_curs_win(x, y);
+               return 0;
+       }
+       else
+       {
+               tile_wid = td->tile_wid;
+               tile_hgt = td->tile_hgt;
+       }
+
+       /* Frame the grid */
+       rc.left = x * tile_wid + td->size_ow1;
+       rc.right = rc.left + 2 * tile_wid;
+       rc.top = y * tile_hgt + td->size_oh1;
+       rc.bottom = rc.top + tile_hgt;
 
        /* Cursor is done as a yellow "box" */
        hdc = GetDC(td->w);
@@ -2288,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;
@@ -2357,7 +2599,7 @@ static errr Term_text_win(int x, int y, int n, byte a, const char *s)
                for (i = 0; i < n; i++)
                {
 #ifdef JP
-                       if (use_bigtile && *(s+i)=="¢ò"[0] && *(s+i+1)=="¢ò"[1])
+                       if (use_bigtile && *(s+i)=="¢£"[0] && *(s+i+1)=="¢£"[1])
                        {
                                rc.right += td->font_wid;
 
@@ -2381,7 +2623,7 @@ static errr Term_text_win(int x, int y, int n, byte a, const char *s)
                                rc.right += td->font_wid;
                                /* Dump the text */
                                ExtTextOut(hdc, rc.left, rc.top, ETO_CLIPPED, &rc,
-                                      s+i, 2, NULL);
+                                      s+i, 2, NULL);
                                rc.right -= td->font_wid;
 
                                /* Advance */
@@ -2403,8 +2645,31 @@ 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);
+                                      s+i, 1, NULL);
 
                                /* Advance */
                                rc.left += td->tile_wid;
@@ -2413,12 +2678,13 @@ static errr Term_text_win(int x, int y, int n, byte a, const char *s)
 #else
                        /* Dump the text */
                        ExtTextOut(hdc, rc.left, rc.top, 0, &rc,
-                                  s+i, 1, NULL);
+                                  s+i, 1, NULL);
 
                        /* Advance */
                        rc.left += td->tile_wid;
                        rc.right += td->tile_wid;
 #endif
+#endif
 
                }
        }
@@ -2428,7 +2694,7 @@ static errr Term_text_win(int x, int y, int n, byte a, const char *s)
        {
                /* Dump the text */
                ExtTextOut(hdc, rc.left, rc.top, ETO_OPAQUE | ETO_CLIPPED, &rc,
-                          s, n, NULL);
+                          s, n, NULL);
        }
 
        /* Release DC */
@@ -2452,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);
 
@@ -2465,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;
@@ -2516,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)
        {
@@ -2540,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;
@@ -2581,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))
@@ -2608,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 */
@@ -2617,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);
 
@@ -2634,13 +2878,6 @@ static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp)
 }
 
 
-#ifdef USE_TRANSPARENCY
-extern void map_info(int y, int x, byte *ap, char *cp, byte *tap, char *tcp);
-#else /* USE_TRANSPARENCY */
-extern void map_info(int y, int x, byte *ap, char *cp);
-#endif /* USE_TRANSPARENCY */
-
-
 static void windows_map(void)
 {
        term_data *td = &data[0];
@@ -2648,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;
@@ -2674,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 */
                        }
                }
        }
@@ -2741,6 +2968,7 @@ static void term_data_link(term_data *td)
        t->user_hook = Term_user_win;
        t->xtra_hook = Term_xtra_win;
        t->curs_hook = Term_curs_win;
+       t->bigcurs_hook = Term_bigcurs_win;
        t->wipe_hook = Term_wipe_win;
        t->text_hook = Term_text_win;
        t->pict_hook = Term_pict_win;
@@ -2765,7 +2993,7 @@ static void init_windows(void)
 
        term_data *td;
 
-#ifndef JP
+#if 0 /* #ifndef JP */
        char buf[1024];
 #endif
 
@@ -2788,8 +3016,8 @@ static void init_windows(void)
        td->size_oh2 = 2;
        td->pos_x = 7 * 30;
        td->pos_y = 7 * 20;
-
-#ifdef JP
+       td->posfix = FALSE;
+#if 1 /* #ifdef JP */
        td->bizarre = TRUE;
 #endif
        /* Sub windows */
@@ -2808,7 +3036,8 @@ static void init_windows(void)
                td->size_oh2 = 1;
                td->pos_x = (7 - i) * 30;
                td->pos_y = (7 - i) * 20;
-#ifdef JP
+               td->posfix = FALSE;
+#if 1 /* #ifdef JP */
                        td->bizarre = TRUE;
 #endif
        }
@@ -2821,8 +3050,8 @@ static void init_windows(void)
        /* 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);
+                      WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION |
+                      WS_VISIBLE);
        td->dwExStyle = 0;
        td->visible = TRUE;
 
@@ -2840,11 +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.lfHeight = td->tile_hgt;
-               td->lf.lfWidth  = td->tile_wid;
-               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);
@@ -2852,13 +3079,13 @@ static void init_windows(void)
                td->tile_hgt = td->font_hgt;
 #else
                /* Access the standard font file */
-               path_build(buf, 1024, ANGBAND_DIR_XTRA_FONT, td->font_want);
+               path_build(buf, sizeof(buf), 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");
+                       path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_FONT, "8X13.FON");
 
                        /* Force the use of that font */
                        (void)term_force_font(td, buf);
@@ -2888,10 +3115,10 @@ static void init_windows(void)
 
                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);
+                                      td->s, td->dwStyle,
+                                      td->pos_x, td->pos_y,
+                                      td->size_wid, td->size_hgt,
+                                      HWND_DESKTOP, NULL, hInstance, NULL);
                my_td = NULL;
 #ifdef JP
                if (!td->w) quit("¥µ¥Ö¥¦¥£¥ó¥É¥¦¤ËºîÀ®¤Ë¼ºÇÔ¤·¤Þ¤·¤¿");
@@ -2914,9 +3141,15 @@ static void init_windows(void)
                {
                        /* Activate the window */
                        SetActiveWindow(td->w);
+               }
 
-                       /* Bring window to top */
-                       SetWindowPos(td->w, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
+               if (data[i].posfix)
+               {
+                       term_window_pos(&data[i], HWND_TOPMOST);
+               }
+               else
+               {
+                       term_window_pos(&data[i], td->w);
                }
        }
 
@@ -2927,10 +3160,10 @@ static void init_windows(void)
        /* 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);
+                              td->s, td->dwStyle,
+                              td->pos_x, td->pos_y,
+                              td->size_wid, td->size_hgt,
+                              HWND_DESKTOP, NULL, hInstance, NULL);
        my_td = NULL;
 #ifdef JP
        if (!td->w) quit("¥á¥¤¥ó¥¦¥£¥ó¥É¥¦¤ÎºîÀ®¤Ë¼ºÇÔ¤·¤Þ¤·¤¿");
@@ -2941,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);
@@ -2975,15 +3211,15 @@ static void setup_menus(void)
 
        /* Menu "File", Disable all */
        EnableMenuItem(hm, IDM_FILE_NEW,
-                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
+                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
        EnableMenuItem(hm, IDM_FILE_OPEN,
-                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
+                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
        EnableMenuItem(hm, IDM_FILE_SAVE,
-                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
+                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
        EnableMenuItem(hm, IDM_FILE_EXIT,
-                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
+                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
        EnableMenuItem(hm, IDM_FILE_SCORE,
-                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
+                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
 
 
        /* No character available */
@@ -3001,40 +3237,56 @@ static void setup_menus(void)
        {
                /* Menu "File", Item "Save" */
                EnableMenuItem(hm, IDM_FILE_SAVE,
-                          MF_BYCOMMAND | MF_ENABLED);
+                          MF_BYCOMMAND | MF_ENABLED);
        }
 
        /* Menu "File", Item "Exit" */
        EnableMenuItem(hm, IDM_FILE_EXIT,
-                      MF_BYCOMMAND | MF_ENABLED);
+                      MF_BYCOMMAND | MF_ENABLED);
 
        EnableMenuItem(hm, IDM_FILE_SCORE,
-                      MF_BYCOMMAND | MF_ENABLED);
+                      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);
+                              MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
 
                CheckMenuItem(hm, IDM_WINDOW_VIS_0 + i,
-                             (data[i].visible ? MF_CHECKED : MF_UNCHECKED));
+                             (data[i].visible ? MF_CHECKED : MF_UNCHECKED));
 
                EnableMenuItem(hm, IDM_WINDOW_VIS_0 + i,
-                              MF_BYCOMMAND | MF_ENABLED);
+                              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);
+                              MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
 
                if (data[i].visible)
                {
                        EnableMenuItem(hm, IDM_WINDOW_FONT_0 + i,
-                                      MF_BYCOMMAND | MF_ENABLED);
+                                      MF_BYCOMMAND | MF_ENABLED);
+               }
+       }
+
+       /* Menu "Window::Window Position Fix" */
+       for (i = 0; i < MAX_TERM_DATA; i++)
+       {
+               EnableMenuItem(hm, IDM_WINDOW_POS_0 + i,
+                              MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
+
+               CheckMenuItem(hm, IDM_WINDOW_POS_0 + i,
+                             (data[i].posfix ? MF_CHECKED : MF_UNCHECKED));
+
+               if (data[i].visible)
+               {
+                       EnableMenuItem(hm, IDM_WINDOW_POS_0 + i,
+                                      MF_BYCOMMAND | MF_ENABLED);
                }
        }
 
@@ -3042,15 +3294,15 @@ static void setup_menus(void)
        for (i = 0; i < MAX_TERM_DATA; i++)
        {
                EnableMenuItem(hm, IDM_WINDOW_BIZ_0 + i,
-                              MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
+                              MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
 
                CheckMenuItem(hm, IDM_WINDOW_BIZ_0 + i,
-                             (data[i].bizarre ? MF_CHECKED : MF_UNCHECKED));
+                             (data[i].bizarre ? MF_CHECKED : MF_UNCHECKED));
 
                if (data[i].visible)
                {
                        EnableMenuItem(hm, IDM_WINDOW_BIZ_0 + i,
-                                  MF_BYCOMMAND | MF_ENABLED);
+                                  MF_BYCOMMAND | MF_ENABLED);
 
                }
        }
@@ -3059,12 +3311,12 @@ static void setup_menus(void)
        for (i = 0; i < MAX_TERM_DATA; i++)
        {
                EnableMenuItem(hm, IDM_WINDOW_I_WID_0 + i,
-                              MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
+                              MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
 
                if (data[i].visible)
                {
                        EnableMenuItem(hm, IDM_WINDOW_I_WID_0 + i,
-                                  MF_BYCOMMAND | MF_ENABLED);
+                                  MF_BYCOMMAND | MF_ENABLED);
 
                }
        }
@@ -3073,12 +3325,12 @@ static void setup_menus(void)
        for (i = 0; i < MAX_TERM_DATA; i++)
        {
                EnableMenuItem(hm, IDM_WINDOW_D_WID_0 + i,
-                              MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
+                              MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
 
                if (data[i].visible)
                {
                        EnableMenuItem(hm, IDM_WINDOW_D_WID_0 + i,
-                                  MF_BYCOMMAND | MF_ENABLED);
+                                  MF_BYCOMMAND | MF_ENABLED);
 
                }
        }
@@ -3087,12 +3339,12 @@ static void setup_menus(void)
        for (i = 0; i < MAX_TERM_DATA; i++)
        {
                EnableMenuItem(hm, IDM_WINDOW_I_HGT_0 + i,
-                              MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
+                              MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
 
                if (data[i].visible)
                {
                        EnableMenuItem(hm, IDM_WINDOW_I_HGT_0 + i,
-                                  MF_BYCOMMAND | MF_ENABLED);
+                                  MF_BYCOMMAND | MF_ENABLED);
 
                }
        }
@@ -3101,30 +3353,30 @@ static void setup_menus(void)
        for (i = 0; i < MAX_TERM_DATA; i++)
        {
                EnableMenuItem(hm, IDM_WINDOW_D_HGT_0 + i,
-                              MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
+                              MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
 
                if (data[i].visible)
                {
                        EnableMenuItem(hm, IDM_WINDOW_D_HGT_0 + i,
-                                  MF_BYCOMMAND | MF_ENABLED);
+                                  MF_BYCOMMAND | MF_ENABLED);
 
                }
        }
 
        /* Menu "Options", disable all */
        EnableMenuItem(hm, IDM_OPTIONS_NO_GRAPHICS,
-                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
+                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
        EnableMenuItem(hm, IDM_OPTIONS_OLD_GRAPHICS,
-                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
+                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
        EnableMenuItem(hm, IDM_OPTIONS_NEW_GRAPHICS,
-                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
+                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
        EnableMenuItem(hm, IDM_OPTIONS_BIGTILE,
-                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
+                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
        EnableMenuItem(hm, IDM_OPTIONS_SOUND,
-                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
+                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
 #ifndef JP
        EnableMenuItem(hm, IDM_OPTIONS_SAVER,
-                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
+                      MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
 #endif
 
        /* Menu "Options", Item "Map" */
@@ -3132,24 +3384,24 @@ static void setup_menus(void)
                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);
+                              MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
 
        /* Menu "Options", update all */
        CheckMenuItem(hm, IDM_OPTIONS_NO_GRAPHICS,
-                     (arg_graphics == GRAPHICS_NONE ? MF_CHECKED : MF_UNCHECKED));
+                     (arg_graphics == GRAPHICS_NONE ? MF_CHECKED : MF_UNCHECKED));
        CheckMenuItem(hm, IDM_OPTIONS_OLD_GRAPHICS,
-                     (arg_graphics == GRAPHICS_ORIGINAL ? MF_CHECKED : MF_UNCHECKED));
+                     (arg_graphics == GRAPHICS_ORIGINAL ? MF_CHECKED : MF_UNCHECKED));
        CheckMenuItem(hm, IDM_OPTIONS_NEW_GRAPHICS,
-                     (arg_graphics == GRAPHICS_ADAM_BOLT ? MF_CHECKED : MF_UNCHECKED));
+                     (arg_graphics == GRAPHICS_ADAM_BOLT ? MF_CHECKED : MF_UNCHECKED));
        CheckMenuItem(hm, IDM_OPTIONS_BIGTILE,
-                     (arg_bigtile ? MF_CHECKED : MF_UNCHECKED));
+                     (arg_bigtile ? MF_CHECKED : MF_UNCHECKED));
        CheckMenuItem(hm, IDM_OPTIONS_SOUND,
-                     (arg_sound ? MF_CHECKED : MF_UNCHECKED));
+                     (arg_sound ? MF_CHECKED : MF_UNCHECKED));
        CheckMenuItem(hm, IDM_OPTIONS_BG,
-                     (use_bg ? MF_CHECKED : MF_UNCHECKED));
+                     (use_bg ? MF_CHECKED : MF_UNCHECKED));
 #ifndef JP
        CheckMenuItem(hm, IDM_OPTIONS_SAVER,
-                     (hwndSaver ? MF_CHECKED : MF_UNCHECKED));
+                     (hwndSaver ? MF_CHECKED : MF_UNCHECKED));
 #endif
 
 #ifdef USE_GRAPHICS
@@ -3171,7 +3423,7 @@ static void setup_menus(void)
 #ifdef USE_SAVER
        /* Menu "Options", Item "ScreenSaver" */
        EnableMenuItem(hm, IDM_OPTIONS_SAVER,
-                      MF_BYCOMMAND | MF_ENABLED);
+                      MF_BYCOMMAND | MF_ENABLED);
 #endif /* USE_SAVER */
 }
 
@@ -3346,7 +3598,7 @@ static void process_menus(WORD wCmd)
                                if (!can_save)
                                {
 #ifdef JP
-                               plog("º£¤Ï½ªÎ»¤Ç¤­¤Þ¤»¤ó¡£");
+                                       plog("º£¤Ï½ªÎ»¤Ç¤­¤Þ¤»¤ó¡£");
 #else
                                        plog("You may not do that right now.");
 #endif
@@ -3363,10 +3615,12 @@ static void process_menus(WORD wCmd)
 
                                /* Save the game */
 #ifdef ZANGBAND
-                               do_cmd_save_game(FALSE);
+                               /* do_cmd_save_game(FALSE); */
 #else /* ZANGBAND */
-                               do_cmd_save_game();
+                               /* do_cmd_save_game(); */
 #endif /* ZANGBAND */
+                               Term_key_push(SPECIAL_KEY_QUIT);
+                               break;
                        }
                        quit(NULL);
                        break;
@@ -3378,7 +3632,7 @@ static void process_menus(WORD wCmd)
                        char buf[1024];
 
                        /* Build the filename */
-                       path_build(buf, 1024, ANGBAND_DIR_APEX, "scores.raw");
+                       path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
 
                        /* Open the binary high score file, for reading */
                        highscore_fd = fd_open(buf, O_RDONLY);
@@ -3415,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:
                {
@@ -3452,6 +3749,7 @@ static void process_menus(WORD wCmd)
                        else
                        {
                                td->visible = FALSE;
+                               td->posfix = FALSE;
                                ShowWindow(td->w, SW_HIDE);
                        }
 
@@ -3479,6 +3777,35 @@ static void process_menus(WORD wCmd)
                        break;
                }
 
+               /* Window Z Position */
+               case IDM_WINDOW_POS_1:
+               case IDM_WINDOW_POS_2:
+               case IDM_WINDOW_POS_3:
+               case IDM_WINDOW_POS_4:
+               case IDM_WINDOW_POS_5:
+               case IDM_WINDOW_POS_6:
+               case IDM_WINDOW_POS_7:
+               {
+                       i = wCmd - IDM_WINDOW_POS_0;
+
+                       if ((i < 0) || (i >= MAX_TERM_DATA)) break;
+
+                       td = &data[i];
+
+                       if (!td->posfix && td->visible)
+                       {
+                               td->posfix = TRUE;
+                               term_window_pos(td, HWND_TOPMOST);
+                       }
+                       else
+                       {
+                               td->posfix = FALSE;
+                               term_window_pos(td, data[0].w);
+                       }
+
+                       break;
+               }
+
                /* Bizarre Display */
                case IDM_WINDOW_BIZ_0:
                case IDM_WINDOW_BIZ_1:
@@ -3810,7 +4137,6 @@ static void process_menus(WORD wCmd)
 
                        if (GetSaveFileName(&ofn))
                        {
-                               extern void do_cmd_save_screen_html_aux(char *filename, int message);
                                do_cmd_save_screen_html_aux(buf, 0);
                        }
                        break;
@@ -3829,11 +4155,11 @@ static void process_menus(WORD wCmd)
                        {
                                /* Create a screen scaver window */
                                hwndSaver = CreateWindowEx(WS_EX_TOPMOST, "WindowsScreenSaverClass",
-                                                          "Angband Screensaver",
-                                                          WS_POPUP | WS_MAXIMIZE | WS_VISIBLE,
-                                                          0, 0, GetSystemMetrics(SM_CXSCREEN),
-                                                          GetSystemMetrics(SM_CYSCREEN),
-                                                          NULL, NULL, hInstance, NULL);
+                                                          "Angband Screensaver",
+                                                          WS_POPUP | WS_MAXIMIZE | WS_VISIBLE,
+                                                          0, 0, GetSystemMetrics(SM_CXSCREEN),
+                                                          GetSystemMetrics(SM_CYSCREEN),
+                                                          NULL, NULL, hInstance, NULL);
 
                                if (hwndSaver)
                                {
@@ -3865,7 +4191,7 @@ static void process_menus(WORD wCmd)
                {
 #ifdef HTML_HELP
                        char tmp[1024];
-                       path_build(tmp, 1024, ANGBAND_DIR_XTRA_HELP, "zangband.chm");
+                       path_build(tmp, sizeof(tmp), ANGBAND_DIR_XTRA_HELP, "zangband.chm");
                        if (check_file(tmp))
                        {
                                HtmlHelp(data[0].w, tmp, HH_DISPLAY_TOPIC, 0);
@@ -3885,7 +4211,7 @@ static void process_menus(WORD wCmd)
 #else /* HTML_HELP */
                        char buf[1024];
                        char tmp[1024];
-                       path_build(tmp, 1024, ANGBAND_DIR_XTRA_HELP, "zangband.hlp");
+                       path_build(tmp, sizeof(tmp), ANGBAND_DIR_XTRA_HELP, "zangband.hlp");
                        if (check_file(tmp))
                        {
                                sprintf(buf, "winhelp.exe %s", tmp);
@@ -3909,15 +4235,105 @@ 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,
-                                  WPARAM wParam, LPARAM lParam);
+                                 WPARAM wParam, LPARAM lParam);
 LRESULT FAR PASCAL AngbandWndProc(HWND hWnd, UINT uMsg,
-                                  WPARAM wParam, LPARAM lParam)
+                                 WPARAM wParam, LPARAM lParam)
 #else /* __MWERKS__ */
 LRESULT FAR PASCAL AngbandWndProc(HWND hWnd, UINT uMsg,
-                                          WPARAM wParam, LPARAM lParam)
+                                         WPARAM wParam, LPARAM lParam)
 #endif /* __MWERKS__ */
 {
        PAINTSTRUCT ps;
@@ -3986,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;
+               }
 
-                       /* 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_CHAR:
+               {
+                       if (Term_no_press) Term_no_press = FALSE;
+                       else Term_keypress(wParam);
+                       return 0;
+               }
 
-                       /* Handle "special" keys */
-                       if (special_key[(byte)(wParam)] || (ma && !ignore_key[(byte)(wParam)]) )
-                       {
-                               /* Begin the macro trigger */
-                               Term_keypress(31);
+               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;
+               }
 
-                               /* Send the modifiers */
-                               if (mc) Term_keypress('C');
-                               if (ms) Term_keypress('S');
-                               if (ma) Term_keypress('A');
+               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;
+
+                       mouse_down = FALSE;
+                       paint_rect = FALSE;
+
+#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);
+
+                       for (i = 0; i < dy; i++)
+                       {
+#ifdef JP
+                               char *s;
+                               char **scr = data[0].t.scr->c;
 
-                               /* Extract "scan code" */
-                               i = LOBYTE(HIWORD(lParam));
+                               C_MAKE(s, (dx + 1), char);
+                               strncpy(s, &scr[oy + i][ox], dx);
 
-                               /* Introduce the scan code */
-                               Term_keypress('x');
+                               if (ox > 0)
+                               {
+                                       if (iskanji(scr[oy + i][ox - 1])) s[0] = ' ';
+                               }
 
-                               /* Encode the hexidecimal scan code */
-                               Term_keypress(hexsym[i/16]);
-                               Term_keypress(hexsym[i%16]);
+                               if (ox + dx < data[0].cols)
+                               {
+                                       if (iskanji(scr[oy + i][ox + dx - 1])) s[dx - 1] = ' ';
+                               }
 
-                               /* End the macro trigger */
-                               Term_keypress(13);
+                               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;
                }
 
@@ -4043,7 +4544,11 @@ LRESULT FAR PASCAL AngbandWndProc(HWND hWnd, UINT uMsg,
                        {
                                if (!can_save)
                                {
+#ifdef JP
+                                       plog("º£¤Ï½ªÎ»¤Ç¤­¤Þ¤»¤ó¡£");
+#else
                                        plog("You may not do that right now.");
+#endif
                                        return 0;
                                }
 
@@ -4056,10 +4561,48 @@ LRESULT FAR PASCAL AngbandWndProc(HWND hWnd, UINT uMsg,
 
                                /* Save the game */
 #ifdef ZANGBAND
-                               do_cmd_save_game(FALSE);
+                               /* do_cmd_save_game(FALSE); */
 #else /* ZANGBAND */
-                               do_cmd_save_game();
+                               /* do_cmd_save_game(); */
 #endif /* ZANGBAND */
+                               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;
@@ -4117,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);
 
@@ -4176,8 +4725,7 @@ LRESULT FAR PASCAL AngbandWndProc(HWND hWnd, UINT uMsg,
                                /* Do something to sub-windows */
                                for (i = 1; i < MAX_TERM_DATA; i++)
                                {
-                                       SetWindowPos(data[i].w, hWnd, 0, 0, 0, 0,
-                                                    SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
+                                       if (!data[i].posfix) term_window_pos(&data[i], hWnd);
                                }
 
                                /* Focus on main window */
@@ -4188,6 +4736,26 @@ LRESULT FAR PASCAL AngbandWndProc(HWND hWnd, UINT uMsg,
 
                        break;
                }
+
+               case WM_ACTIVATEAPP:
+               {
+                       if (IsIconic(td->w)) break;
+
+                       for (i = 1; i < MAX_TERM_DATA; i++)
+                       {
+                               if(data[i].visible)
+                               {
+                                       if (wParam == TRUE)
+                                       {
+                                               ShowWindow(data[i].w, SW_SHOW);
+                                       }
+                                       else
+                                       {
+                                               ShowWindow(data[i].w, SW_HIDE);
+                                       }
+                               }
+                       }
+               }
        }
 
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
@@ -4196,12 +4764,12 @@ LRESULT FAR PASCAL AngbandWndProc(HWND hWnd, UINT uMsg,
 
 #ifdef __MWERKS__
 LRESULT FAR PASCAL AngbandListProc(HWND hWnd, UINT uMsg,
-                                           WPARAM wParam, LPARAM lParam);
+                                          WPARAM wParam, LPARAM lParam);
 LRESULT FAR PASCAL AngbandListProc(HWND hWnd, UINT uMsg,
-                                           WPARAM wParam, LPARAM lParam)
+                                          WPARAM wParam, LPARAM lParam)
 #else /* __MWERKS__ */
 LRESULT FAR PASCAL AngbandListProc(HWND hWnd, UINT uMsg,
-                                           WPARAM wParam, LPARAM lParam)
+                                          WPARAM wParam, LPARAM lParam)
 #endif /* __MWERKS__ */
 {
        term_data *td;
@@ -4320,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;
                }
 
@@ -4416,12 +4951,12 @@ LRESULT FAR PASCAL AngbandListProc(HWND hWnd, UINT uMsg,
 
 #ifdef __MWERKS__
 LRESULT FAR PASCAL AngbandSaverProc(HWND hWnd, UINT uMsg,
-                                    WPARAM wParam, LPARAM lParam);
+                                   WPARAM wParam, LPARAM lParam);
 LRESULT FAR PASCAL AngbandSaverProc(HWND hWnd, UINT uMsg,
-                                    WPARAM wParam, LPARAM lParam)
+                                   WPARAM wParam, LPARAM lParam)
 #else /* __MWERKS__ */
 LRESULT FAR PASCAL AngbandSaverProc(HWND hWnd, UINT uMsg,
-                                            WPARAM wParam, LPARAM lParam)
+                                           WPARAM wParam, LPARAM lParam)
 #endif /* __MWERKS__ */
 {
        static int iMouse = 0;
@@ -4519,10 +5054,10 @@ static void hack_plog(cptr str)
        {
 #ifdef JP
                MessageBox(NULL, str, "·Ù¹ð¡ª",
-                          MB_ICONEXCLAMATION | MB_OK);
+                          MB_ICONEXCLAMATION | MB_OK);
 #else
                MessageBox(NULL, str, "Warning",
-                          MB_ICONEXCLAMATION | MB_OK);
+                          MB_ICONEXCLAMATION | MB_OK);
 #endif
 
        }
@@ -4539,10 +5074,10 @@ static void hack_quit(cptr str)
        {
 #ifdef JP
                MessageBox(NULL, str, "¥¨¥é¡¼¡ª",
-                          MB_ICONEXCLAMATION | MB_OK | MB_ICONSTOP);
+                          MB_ICONEXCLAMATION | MB_OK | MB_ICONSTOP);
 #else
                MessageBox(NULL, str, "Error",
-                          MB_ICONEXCLAMATION | MB_OK | MB_ICONSTOP);
+                          MB_ICONEXCLAMATION | MB_OK | MB_ICONSTOP);
 #endif
 
        }
@@ -4572,10 +5107,10 @@ static void hook_plog(cptr str)
        {
 #ifdef JP
                MessageBox(data[0].w, str, "·Ù¹ð¡ª",
-                          MB_ICONEXCLAMATION | MB_OK);
+                          MB_ICONEXCLAMATION | MB_OK);
 #else
                MessageBox(data[0].w, str, "Warning",
-                          MB_ICONEXCLAMATION | MB_OK);
+                          MB_ICONEXCLAMATION | MB_OK);
 #endif
 
        }
@@ -4595,10 +5130,10 @@ static void hook_quit(cptr str)
        {
 #ifdef JP
                MessageBox(data[0].w, str, "¥¨¥é¡¼¡ª",
-                          MB_ICONEXCLAMATION | MB_OK | MB_ICONSTOP);
+                          MB_ICONEXCLAMATION | MB_OK | MB_ICONSTOP);
 #else
                MessageBox(data[0].w, str, "Error",
-                          MB_ICONEXCLAMATION | MB_OK | MB_ICONSTOP);
+                          MB_ICONEXCLAMATION | MB_OK | MB_ICONSTOP);
 #endif
 
        }
@@ -4624,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 */
 
@@ -4722,9 +5255,9 @@ static void init_stuff(void)
 
        /* Build the filename */
 #ifdef JP
-       path_build(path, 1024, ANGBAND_DIR_FILE, "news_j.txt");
+       path_build(path, sizeof(path), ANGBAND_DIR_FILE, "news_j.txt");
 #else
-       path_build(path, 1024, ANGBAND_DIR_FILE, "news.txt");
+       path_build(path, sizeof(path), ANGBAND_DIR_FILE, "news.txt");
 #endif
 
 
@@ -4732,9 +5265,9 @@ static void init_stuff(void)
        validate_file(path);
 
 
-#ifndef JP
+#if 0 /* #ifndef JP */
        /* Build the "font" path */
-       path_build(path, 1024, ANGBAND_DIR_XTRA, "font");
+       path_build(path, sizeof(path), ANGBAND_DIR_XTRA, "font");
 
        /* Allocate the path */
        ANGBAND_DIR_XTRA_FONT = string_make(path);
@@ -4743,7 +5276,7 @@ static void init_stuff(void)
        validate_dir(ANGBAND_DIR_XTRA_FONT, TRUE);
 
        /* Build the filename */
-       path_build(path, 1024, ANGBAND_DIR_XTRA_FONT, "8X13.FON");
+       path_build(path, sizeof(path), ANGBAND_DIR_XTRA_FONT, "8X13.FON");
 
        /* Hack -- Validate the basic font */
        validate_file(path);
@@ -4753,7 +5286,7 @@ static void init_stuff(void)
 #ifdef USE_GRAPHICS
 
        /* Build the "graf" path */
-       path_build(path, 1024, ANGBAND_DIR_XTRA, "graf");
+       path_build(path, sizeof(path), ANGBAND_DIR_XTRA, "graf");
 
        /* Allocate the path */
        ANGBAND_DIR_XTRA_GRAF = string_make(path);
@@ -4767,7 +5300,7 @@ static void init_stuff(void)
 #ifdef USE_SOUND
 
        /* Build the "sound" path */
-       path_build(path, 1024, ANGBAND_DIR_XTRA, "sound");
+       path_build(path, sizeof(path), ANGBAND_DIR_XTRA, "sound");
 
        /* Allocate the path */
        ANGBAND_DIR_XTRA_SOUND = string_make(path);
@@ -4780,7 +5313,7 @@ static void init_stuff(void)
 #ifdef USE_MUSIC
 
        /* Build the "music" path */
-       path_build(path, 1024, ANGBAND_DIR_XTRA, "music");
+       path_build(path, sizeof(path), ANGBAND_DIR_XTRA, "music");
 
        /* Allocate the path */
        ANGBAND_DIR_XTRA_MUSIC = string_make(path);
@@ -4791,7 +5324,7 @@ static void init_stuff(void)
 #endif /* USE_MUSIC */
 
        /* Build the "help" path */
-       path_build(path, 1024, ANGBAND_DIR_XTRA, "help");
+       path_build(path, sizeof(path), ANGBAND_DIR_XTRA, "help");
 
        /* Allocate the path */
        ANGBAND_DIR_XTRA_HELP = string_make(path);
@@ -4802,7 +5335,7 @@ static void init_stuff(void)
 
 
 int FAR PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,
-                       LPSTR lpCmdLine, int nCmdShow)
+                      LPSTR lpCmdLine, int nCmdShow)
 {
        int i;
 
@@ -4810,6 +5343,9 @@ int FAR PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,
        HDC hdc;
        MSG msg;
 
+       /* Unused */
+       (void)nCmdShow;
+
        /* Save globally */
        hInstance = hInst;
 
@@ -4925,18 +5461,20 @@ 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])
          {
          case 'p':
+         case 'P':
            {
              if (!lpCmdLine[2]) break;
              chuukei_server = TRUE;
@@ -4950,6 +5488,7 @@ int FAR PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,
            }
 
          case 'c':
+         case 'C':
            {
              if (!lpCmdLine[2]) break;
              chuukei_client = TRUE;
@@ -4958,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