From 4d3828f6ec46a092fe08ad128561595cd6dcd571 Mon Sep 17 00:00:00 2001 From: PatR Date: Sat, 16 Nov 2019 10:03:57 -0800 Subject: [PATCH 1/3] curses lint 'orient' is the name of an enum defined in wincurs.h so don't use it as a variable name in cursstat.c. My compiler didn't complain using '-Wshadow' but apparently some other one does. Make the same change in the dead code located in the second half of that file, plus a couple of formatting tweaks. --- win/curses/cursstat.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/win/curses/cursstat.c b/win/curses/cursstat.c index 69f0f758c..a2b83d861 100644 --- a/win/curses/cursstat.c +++ b/win/curses/cursstat.c @@ -209,8 +209,8 @@ static void draw_status() { WINDOW *win = curses_get_nhwin(STATUS_WIN); - int orient = curses_get_window_orientation(STATUS_WIN); - boolean horiz = (orient != ALIGN_RIGHT && orient != ALIGN_LEFT); + orient statorient = (orient) curses_get_window_orientation(STATUS_WIN); + boolean horiz = (statorient != ALIGN_RIGHT && statorient != ALIGN_LEFT); boolean border = curses_window_has_border(STATUS_WIN); /* Figure out if we have proper window dimensions for horizontal @@ -1722,18 +1722,14 @@ void curses_update_stats(void) { WINDOW *win = curses_get_nhwin(STATUS_WIN); + orient statorient = (orient) curses_get_window_orientation(STATUS_WIN); + boolean horiz = (statorient != ALIGN_RIGHT && statorient != ALIGN_LEFT); + boolean border = curses_window_has_border(STATUS_WIN); /* Clear the window */ werase(win); - int orient = curses_get_window_orientation(STATUS_WIN); - - boolean horiz = FALSE; - if ((orient != ALIGN_RIGHT) && (orient != ALIGN_LEFT)) - horiz = TRUE; - boolean border = curses_window_has_border(STATUS_WIN); - - /* Figure out if we have proper window dimensions for horizontal statusbar. */ + /* Figure out if we have proper window dimensions for horizontal status */ if (horiz) { /* correct y */ int cy = 3; @@ -1752,7 +1748,8 @@ curses_update_stats(void) curses_last_messages(); doredraw(); - /* Reset XP highlight (since classic_status and new show different numbers) */ + /* Reset XP highlight (since classic_status and new show + different numbers) */ prevexp.highlight_turns = 0; curses_update_stats(); return; @@ -1778,7 +1775,7 @@ curses_update_stats(void) hpmax = u.mhmax; } - if (orient != ALIGN_RIGHT && orient != ALIGN_LEFT) + if (horiz) draw_horizontal(x, y, hp, hpmax); else draw_vertical(x, y, hp, hpmax); @@ -1791,7 +1788,8 @@ curses_update_stats(void) if (first) { first = FALSE; - /* Zero highlight timers. This will call curses_update_status again if needed */ + /* Zero highlight timers. This will call curses_update_status again + if needed */ curses_decrement_highlights(TRUE); } } From 020825bc73d3142a0781a87d19a4f5da463b6456 Mon Sep 17 00:00:00 2001 From: PatR Date: Sat, 16 Nov 2019 11:46:50 -0800 Subject: [PATCH 2/3] monsters entering regions Region processing does a lot of looping--when there are actually regions present--and calls functions in those loops which do more looping of their own. This moves some of the simpler tests so that they get done sooner and can avoid some of those function calls. I was hoping that it would speed up the turn cycle on the Plane of Fire where the spontaneous irregularly shaped fumaroles are composed of a lot of small regions but I don't think there's any noticeable difference. In process of doing that, I discovered a bug (no doubt copy+paste which escaped an intended update) with monster handling. The check for whether a monster is entering a region depends upon whether the hero is in that same region rather than whether the monster is already inside. So a monster can enter a region--or have a moving one enclose it--with impunity if the hero is already in that region. Once the hero moves out of it, the monster will finally enter it. --- doc/fixes36.3 | 4 ++- src/region.c | 94 +++++++++++++++++++++++++++++---------------------- 2 files changed, 56 insertions(+), 42 deletions(-) diff --git a/doc/fixes36.3 b/doc/fixes36.3 index d65976a9d..302dd0e0c 100644 --- a/doc/fixes36.3 +++ b/doc/fixes36.3 @@ -1,4 +1,4 @@ -$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.178 $ $NHDT-Date: 1573848574 2019/11/15 20:09:34 $ +$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.180 $ $NHDT-Date: 1573933605 2019/11/16 19:46:45 $ This fixes36.3 file is here to capture information about updates in the 3.6.x lineage following the release of 3.6.2 in May 2019. Please note, however, @@ -233,6 +233,8 @@ dipping into an undiscovered potion would offer chance to give a name to the dipping lichen corpse into acid when not blind and acid was undicovered would not offer a chance to give a name to the potion after lichen feedback pluralization improvement for words ending in a k-sound like "biotech" +check for whether a monster was entering a region (gas cloud) erroneously + depended upon whether or not the hero was inside the same region Fixes to Post-3.6.2 Problems that Were Exposed Via git Repository diff --git a/src/region.c b/src/region.c index ad94426fa..9422de20c 100644 --- a/src/region.c +++ b/src/region.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 region.c $NHDT-Date: 1543455828 2018/11/29 01:43:48 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.43 $ */ +/* NetHack 3.6 region.c $NHDT-Date: 1573933605 2019/11/16 19:46:45 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.44 $ */ /* Copyright (c) 1996 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ @@ -430,24 +430,25 @@ xchar x, y; { int i, f_indx; - /* First check if we can do the move */ + /* First check if hero can do the move */ for (i = 0; i < n_regions; i++) { - if (inside_region(regions[i], x, y) && !hero_inside(regions[i]) - && !regions[i]->attach_2_u) { - if ((f_indx = regions[i]->can_enter_f) != NO_CALLBACK) - if (!(*callbacks[f_indx])(regions[i], (genericptr_t) 0)) - return FALSE; - } else if (hero_inside(regions[i]) && !inside_region(regions[i], x, y) - && !regions[i]->attach_2_u) { - if ((f_indx = regions[i]->can_leave_f) != NO_CALLBACK) - if (!(*callbacks[f_indx])(regions[i], (genericptr_t) 0)) - return FALSE; + if (regions[i]->attach_2_u) + continue; + if (inside_region(regions[i], x, y) + ? (!hero_inside(regions[i]) + && (f_indx = regions[i]->can_enter_f) != NO_CALLBACK) + : (hero_inside(regions[i]) + && (f_indx = regions[i]->can_leave_f) != NO_CALLBACK)) { + if (!(*callbacks[f_indx])(regions[i], (genericptr_t) 0)) + return FALSE; } } - /* Callbacks for the regions we do leave */ - for (i = 0; i < n_regions; i++) - if (hero_inside(regions[i]) && !regions[i]->attach_2_u + /* Callbacks for the regions hero does leave */ + for (i = 0; i < n_regions; i++) { + if (regions[i]->attach_2_u) + continue; + if (hero_inside(regions[i]) && !inside_region(regions[i], x, y)) { clear_hero_inside(regions[i]); if (regions[i]->leave_msg != (const char *) 0) @@ -455,10 +456,13 @@ xchar x, y; if ((f_indx = regions[i]->leave_f) != NO_CALLBACK) (void) (*callbacks[f_indx])(regions[i], (genericptr_t) 0); } + } - /* Callbacks for the regions we do enter */ - for (i = 0; i < n_regions; i++) - if (!hero_inside(regions[i]) && !regions[i]->attach_2_u + /* Callbacks for the regions hero does enter */ + for (i = 0; i < n_regions; i++) { + if (regions[i]->attach_2_u) + continue; + if (!hero_inside(regions[i]) && inside_region(regions[i], x, y)) { set_hero_inside(regions[i]); if (regions[i]->enter_msg != (const char *) 0) @@ -466,12 +470,14 @@ xchar x, y; if ((f_indx = regions[i]->enter_f) != NO_CALLBACK) (void) (*callbacks[f_indx])(regions[i], (genericptr_t) 0); } + } + return TRUE; } /* - * check whether a monster enters/leaves one or more region. -*/ + * check whether a monster enters/leaves one or more regions. + */ boolean m_in_out_region(mon, x, y) struct monst *mon; @@ -479,40 +485,44 @@ xchar x, y; { int i, f_indx; - /* First check if we can do the move */ + /* First check if mon can do the move */ for (i = 0; i < n_regions; i++) { - if (inside_region(regions[i], x, y) && !mon_in_region(regions[i], mon) - && regions[i]->attach_2_m != mon->m_id) { - if ((f_indx = regions[i]->can_enter_f) != NO_CALLBACK) - if (!(*callbacks[f_indx])(regions[i], mon)) - return FALSE; - } else if (mon_in_region(regions[i], mon) - && !inside_region(regions[i], x, y) - && regions[i]->attach_2_m != mon->m_id) { - if ((f_indx = regions[i]->can_leave_f) != NO_CALLBACK) - if (!(*callbacks[f_indx])(regions[i], mon)) - return FALSE; + if (regions[i]->attach_2_m == mon->m_id) + continue; + if (inside_region(regions[i], x, y) + ? (!mon_in_region(regions[i], mon) + && (f_indx = regions[i]->can_enter_f) != NO_CALLBACK) + : (mon_in_region(regions[i], mon) + && (f_indx = regions[i]->can_leave_f) != NO_CALLBACK)) { + if (!(*callbacks[f_indx])(regions[i], mon)) + return FALSE; } } - /* Callbacks for the regions we do leave */ - for (i = 0; i < n_regions; i++) + /* Callbacks for the regions mon does leave */ + for (i = 0; i < n_regions; i++) { + if (regions[i]->attach_2_m == mon->m_id) + continue; if (mon_in_region(regions[i], mon) - && regions[i]->attach_2_m != mon->m_id && !inside_region(regions[i], x, y)) { remove_mon_from_reg(regions[i], mon); if ((f_indx = regions[i]->leave_f) != NO_CALLBACK) (void) (*callbacks[f_indx])(regions[i], mon); } + } - /* Callbacks for the regions we do enter */ - for (i = 0; i < n_regions; i++) - if (!hero_inside(regions[i]) && !regions[i]->attach_2_u + /* Callbacks for the regions mon does enter */ + for (i = 0; i < n_regions; i++) { + if (regions[i]->attach_2_m == mon->m_id) + continue; + if (!mon_in_region(regions[i], mon) && inside_region(regions[i], x, y)) { add_mon_to_reg(regions[i], mon); if ((f_indx = regions[i]->enter_f) != NO_CALLBACK) (void) (*callbacks[f_indx])(regions[i], mon); } + } + return TRUE; } @@ -598,10 +608,12 @@ xchar x, y; { register int i; - for (i = 0; i < n_regions; i++) - if (inside_region(regions[i], x, y) && regions[i]->visible - && regions[i]->ttl != -2L) + for (i = 0; i < n_regions; i++) { + if (!regions[i]->visible || regions[i]->ttl == -2L) + continue; + if (inside_region(regions[i], x, y)) return regions[i]; + } return (NhRegion *) 0; } From 43e4100dd8cac189d0e0595a7504baa4cb7931b8 Mon Sep 17 00:00:00 2001 From: PatR Date: Sat, 16 Nov 2019 12:05:05 -0800 Subject: [PATCH 3/3] partial fix for #H9430 - gas clouds vs monsters Don't show the gas cloud glyph at locations where monsters can be sensed (telepathy, warning, extended detection). It will work better when/if vision of gas cloud locations gets fixed. (Such clouds behave as the hero can see into them, so warning doesn't have any unseen monsters to show unless they're unseen for some reason other than the gas cloud.) --- src/display.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/display.c b/src/display.c index 7d948deae..e09e9ff45 100644 --- a/src/display.c +++ b/src/display.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 display.c $NHDT-Date: 1567213890 2019/08/31 01:11:30 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.106 $ */ +/* NetHack 3.6 display.c $NHDT-Date: 1573934698 2019/11/16 20:04:58 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.107 $ */ /* Copyright (c) Dean Luick, with acknowledgements to Kevin Darcy */ /* and Dave Cohrs, 1990. */ /* NetHack may be freely redistributed. See license for details. */ @@ -762,12 +762,19 @@ register int x, y; */ lev->waslit = (lev->lit != 0); /* remember lit condition */ - /* normal region shown only on accessible positions, but poison clouds - * also shown above lava, pools and moats. + mon = m_at(x, y); + worm_tail = is_worm_tail(mon); + + /* + * Normal region shown only on accessible positions, but + * poison clouds also shown above lava, pools and moats. + * However, sensed monsters take precedence over all regions. */ - if (reg && (ACCESSIBLE(lev->typ) - || (reg->glyph == cmap_to_glyph(S_poisoncloud) - && is_pool_or_lava(x, y)))) { + if (reg + && (ACCESSIBLE(lev->typ) + || (reg->glyph == cmap_to_glyph(S_poisoncloud) + && is_pool_or_lava(x, y))) + && (!mon || worm_tail || !sensemon(mon))) { show_region(reg, x, y); return; } @@ -782,8 +789,6 @@ register int x, y; if (see_self) display_self(); } else { - mon = m_at(x, y); - worm_tail = is_worm_tail(mon); see_it = mon && (mon_visible(mon) || (!worm_tail && (tp_sensemon(mon) || MATCH_WARN_OF_MON(mon))));