win32 gui bits
authornhmall <nhmall@nethack.org>
Sat, 8 Sep 2018 12:54:35 +0000 (08:54 -0400)
committernhmall <nhmall@nethack.org>
Sat, 8 Sep 2018 12:54:35 +0000 (08:54 -0400)
fix an index out-of-bounds
status hitpoint bar behavior at zero hp to match tty

doc/fixes36.2
win/win32/mhstatus.c
win/win32/mswproc.c

index ccaa24f4bf5a76755a941b9aed6b7bb2705e7f59..e34ec28fca21c529754d69c1254b2deef48fcb0b 100644 (file)
@@ -131,7 +131,8 @@ Platform- and/or Interface-Specific Fixes
 -----------------------------------------
 windows-gui: In nethackw, there could be conflicts between menu accelerators 
        and an extra choice accelerator to fix H7132.
-windows-gui: recognize new BL_RESET in status_update; behavior currently the same
+windows-gui: recognize new BL_RESET in status_update; no change in behavior yet
+windows-gui: align hpbar behavior at zero hit points with tty behavior
 windows-tty: Specify both width and height when creating font for width testing
 windows-tty: To counter lag problems that were occuring with the Win32 console
        port, implement a console back buffer to reduce the number of calls
index 52d24621a59aded16ef73696ffd40bdeb065f6c4..80799ad82c36d30eb26dfce4332a0b9bcc6d6511 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.6 mhstatus.c      $NHDT-Date: 1432512810 2015/05/25 00:13:30 $  $NHDT-Branch: master $:$NHDT-Revision: 1.22 $ */
+/* NetHack 3.6 mhstatus.c      $NHDT-Date: 1536411224 2018/09/08 12:53:44 $  $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.29 $ */
 /* Copyright (C) 2001 by Alex Kompel    */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -324,7 +324,7 @@ onWMPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
         LONG left = rt.left;
         LONG cy = 0;
         int vlen;
-        for (f = *fop; *f != -1; f++) {
+        for (f = *fop; *f != BL_FLUSH; f++) {
             int clr, atr;
             int fntatr = ATR_NONE;
             HGDIOBJ fnt;
@@ -362,7 +362,8 @@ onWMPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
                 SelectObject(hdc, fnt);
                 SetBkMode(hdc, OPAQUE);
                 SetBkColor(hdc, status_bg_color);
-                SetTextColor(hdc, nhcolor_to_RGB(hpbar_color));
+                /* SetTextColor(hdc, nhcolor_to_RGB(hpbar_color)); */
+                               SetTextColor(hdc, status_fg_color);
 
                 /* get bounding rectangle */
                 GetTextExtentPoint32(hdc, wbuf, vlen, &sz);
@@ -370,21 +371,22 @@ onWMPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
                 /* first draw title normally */
                 DrawText(hdc, wbuf, vlen, &rt, DT_LEFT);
 
-                /* calc bar length */
-                barrect.left = rt.left;
-                barrect.top = rt.top;
-                barrect.bottom = sz.cy;
-                if (hpbar_percent > 0)
-                    barrect.right = (int)((hpbar_percent * sz.cx) / 100);
-                else
-                    barrect.right = sz.cx;
-
-                /* then draw hpbar on top of title */
-                FillRect(hdc, &barrect, back_brush);
-                SetBkMode(hdc, TRANSPARENT);
-                SetTextColor(hdc, nBg);
-                DrawText(hdc, wbuf, vlen, &barrect, DT_LEFT);
-
+                if (hpbar_percent > 0) {
+                    /* calc bar length */
+                    barrect.left = rt.left;
+                    barrect.top = rt.top;
+                    barrect.bottom = sz.cy;
+                    if (hpbar_percent > 0)
+                        barrect.right = (int)((hpbar_percent * sz.cx) / 100);
+                    /* else
+                        barrect.right = sz.cx; */
+
+                    /* then draw hpbar on top of title */
+                    FillRect(hdc, &barrect, back_brush);
+                    SetBkMode(hdc, TRANSPARENT);
+                    SetTextColor(hdc, nBg);
+                    DrawText(hdc, wbuf, vlen, &barrect, DT_LEFT);
+                }
                 DeleteObject(back_brush);
             } else {
                 if (atr & HL_INVERSE) {
index fb9ad0a941066f9c8f5406c05fad987f20aef67e..feabf49b2c333fc0b66b3a1cf3740bb10f66f4fe 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.6 mswproc.c       $NHDT-Date: 1451611595 2016/01/01 01:26:35 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.98 $ */
+/* NetHack 3.6 mswproc.c       $NHDT-Date: 1536411259 2018/09/08 12:54:19 $  $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.118 $ */
 /* Copyright (C) 2001 by Alex Kompel    */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -2899,10 +2899,21 @@ mswin_status_update(int idx, genericptr_t ptr, int chg, int percent, int color,
     int ocolor, ochar;
     unsigned ospecial;
     long value = -1;
+    boolean reset_state = FALSE;
 
     logDebug("mswin_status_update(%d, %p, %d, %d, %x, %p)\n", idx, ptr, chg, percent, color, colormasks);
 
-    if (idx != BL_FLUSH && idx != BL_RESET) {
+    switch (idx) {
+        case BL_RESET:
+            reset_state = TRUE;
+            /* FALLTHRU */
+        case BL_FLUSH:
+            /* FALLTHRU */
+        default:
+            break;
+    }
+
+    if (idx >= 0) {
         if (!_status_activefields[idx])
             return;
         _status_percents[idx] = percent;
@@ -2965,18 +2976,18 @@ mswin_status_update(int idx, genericptr_t ptr, int chg, int percent, int color,
                     text);
         } break;
         }
-    }
 
-    _status_colors[idx] = color;
+        _status_colors[idx] = color;
 
-    /* send command to status window */
-    ZeroMemory(&update_cmd_data, sizeof(update_cmd_data));
-    update_cmd_data.n_fields = MAXBLSTATS;
-    update_cmd_data.vals = _status_vals;
-    update_cmd_data.activefields = _status_activefields;
-    update_cmd_data.percents = _status_percents;
-    update_cmd_data.colors = _status_colors;
-    SendMessage(mswin_hwnd_from_winid(WIN_STATUS), WM_MSNH_COMMAND,
+        /* send command to status window */
+        ZeroMemory(&update_cmd_data, sizeof(update_cmd_data));
+        update_cmd_data.n_fields = MAXBLSTATS;
+        update_cmd_data.vals = _status_vals;
+        update_cmd_data.activefields = _status_activefields;
+        update_cmd_data.percents = _status_percents;
+        update_cmd_data.colors = _status_colors;
+        SendMessage(mswin_hwnd_from_winid(WIN_STATUS), WM_MSNH_COMMAND,
                 (WPARAM) MSNH_MSG_UPDATE_STATUS, (LPARAM) &update_cmd_data);
+    }
 }