OSDN Git Service

GF_ICE属性の攻撃に対し、目には目を等の反撃ダメージが発動しないバグを修正。
[hengband/hengband.git] / src / main-win.c
index 5ba035f..05aeacb 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
 /*
  * 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;
@@ -546,7 +559,7 @@ static cptr AngList = "AngList";
 static cptr ANGBAND_DIR_XTRA_GRAF;
 static cptr ANGBAND_DIR_XTRA_SOUND;
 static cptr ANGBAND_DIR_XTRA_HELP;
-#ifndef JP
+#if 0 /* #ifndef JP */
 static cptr ANGBAND_DIR_XTRA_FONT;
 #endif
 #ifdef USE_MUSIC
@@ -565,6 +578,14 @@ static COLORREF win_clr[256];
  */
 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
@@ -825,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;
@@ -1067,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);
@@ -1109,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);
 
@@ -1129,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);
+       }
 }
 
 
@@ -1166,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);
        }
 }
 
@@ -1178,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
 
 
@@ -1199,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);
@@ -1211,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
@@ -1223,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);
+       }
 }
 
 
@@ -1240,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);
 
@@ -1259,11 +1331,7 @@ static void load_prefs(void)
        /* Load window prefs */
        for (i = 0; i < MAX_TERM_DATA; ++i)
        {
-               term_data *td = &data[i];
-
-               sprintf(buf, "Term-%d", i);
-
-               load_prefs_aux(td, buf);
+               load_prefs_aux(i);
        }
 }
 
@@ -1643,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];
@@ -1652,7 +1720,7 @@ static errr term_force_font(term_data *td, cptr path)
        /* Forget the old font (if needed) */
        if (td->font_id) DeleteObject(td->font_id);
 
-#ifdef JP
+#if 1 /* #ifdef JP */
        /* Unused */
        (void)path;
 
@@ -1757,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));
@@ -1869,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);
+}
 
 
 
@@ -2441,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;
@@ -2564,6 +2653,30 @@ static errr Term_text_win(int x, int y, int n, byte a, const char *s)
                                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);
+
+                               /* Advance */
+                               rc.left += td->tile_wid;
+                               rc.right += td->tile_wid;
+                       }
+#else
                        /* Dump the text */
                        ExtTextOut(hdc, rc.left, rc.top, 0, &rc,
                                   s+i, 1, NULL);
@@ -2572,6 +2685,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
 
                }
        }
@@ -2880,7 +2994,7 @@ static void init_windows(void)
 
        term_data *td;
 
-#ifndef JP
+#if 0 /* #ifndef JP */
        char buf[1024];
 #endif
 
@@ -2904,8 +3018,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 */
@@ -2925,7 +3038,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
        }
@@ -2957,9 +3070,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);
@@ -3062,9 +3175,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);
@@ -3554,6 +3670,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:
                {
@@ -4256,6 +4415,124 @@ LRESULT FAR PASCAL AngbandWndProc(HWND hWnd, UINT uMsg,
                        return 0;
                }
 
+               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;
+               }
+
+               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;
+
+                               C_MAKE(s, (dx + 1), char);
+                               strncpy(s, &scr[oy + i][ox], dx);
+
+                               if (ox > 0)
+                               {
+                                       if (iskanji(scr[oy + i][ox - 1])) s[0] = ' ';
+                               }
+
+                               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();
+
+                       Term_redraw();
+
+                       return 0;
+               }
+
+               case WM_MOUSEMOVE:
+               {
+                       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;
+               }
+
                case WM_INITMENU:
                {
                        setup_menus();
@@ -4384,6 +4661,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);
 
@@ -4457,6 +4740,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)
@@ -4981,7 +5266,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");
 
@@ -5185,7 +5470,6 @@ int FAR PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,
 
        /* We are now initialized */
        initialized = TRUE;
-
 #ifdef CHUUKEI
        if(lpCmdLine[0] == '-'){
          switch(lpCmdLine[1])
@@ -5214,6 +5498,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