Don't unconditionally draw noise/equip bar
authoradvil <rawlins@gmail.com>
Wed, 29 Jul 2020 23:40:47 +0000 (19:40 -0400)
committeradvil <rawlins@gmail.com>
Wed, 29 Jul 2020 23:40:47 +0000 (19:40 -0400)
This is mainly aimed at the fact that this bar, unlike everything else
on the hud, unconditionally rendered, so when starting up the game it
would show up on its own at odd times. This commit changes the noise bar
so that it doesn't render during startup, but renders unconditionally
the rest of the time -- smarter logic is no doubt possible, but I was
somewhat defeated by silence. The equip bar only redraws as needed by
gear or weapon changes.

This also removes an unused return value in output.cc and some support
code.

crawl-ref/source/output.cc
crawl-ref/source/output.h
crawl-ref/source/player-equip.cc
crawl-ref/source/player.cc
crawl-ref/source/player.h
crawl-ref/source/startup.cc

index 9769cd8..13d7fd7 100644 (file)
@@ -599,6 +599,7 @@ static void _print_stats_equip(int x, int y)
                 cprintf(".");
         }
     }
+    you.gear_change = false;
 }
 
 /*
@@ -688,6 +689,13 @@ static void _print_stats_noise(int x, int y)
                        div_round_up((level * Noise_Bar.horiz_bar_width), 1000),
                        Noise_Bar.horiz_bar_width);
     }
+    // intentional non-reset: after it has started drawing, we always redraw
+    // noise. There's not a lot of cost to this, and the logic for detecting
+    // if/when silenced status has changed is extremely annoying. So
+    // you.redraw_noise is esentially only used to keep the noise bar from
+    // drawing while the game is starting up. (If someone can figure out how
+    // to correctly detect all the silence special cases, feel free to add that
+    // in and I will see if you succeeded -advil.)
 }
 
 static void _print_stats_gold(int x, int y)
@@ -1152,21 +1160,6 @@ static void _print_status_lights(int y)
 #endif
 }
 
-static bool _need_stats_printed()
-{
-    return you.redraw_title
-           || you.redraw_hit_points
-           || you.redraw_magic_points
-           || you.redraw_armour_class
-           || you.redraw_evasion
-           || you.redraw_stats[STAT_STR]
-           || you.redraw_stats[STAT_INT]
-           || you.redraw_stats[STAT_DEX]
-           || you.redraw_experience
-           || you.wield_change
-           || you.redraw_quiver;
-}
-
 static void _draw_wizmode_flag(const char *word)
 {
     textcolour(LIGHTMAGENTA);
@@ -1274,7 +1267,7 @@ static void _redraw_title()
     textcolour(LIGHTGREY);
 }
 
-bool print_stats()
+void print_stats()
 {
     int ac_pos = 5;
     int ev_pos = ac_pos + 1;
@@ -1301,8 +1294,6 @@ bool print_stats()
         you.redraw_status_lights = true;
     }
 
-    bool has_changed = _need_stats_printed();
-
     if (you.redraw_title)
     {
         you.redraw_title = false;
@@ -1363,8 +1354,11 @@ bool print_stats()
     {
         yhack++;
         if (Options.equip_bar)
-            _print_stats_equip(1, 8+yhack);
-        else
+        {
+             if (you.gear_change || you.wield_change)
+                _print_stats_equip(1, 8+yhack);
+        }
+        else if (you.redraw_noise)
             _print_stats_noise(1, 8+yhack);
     }
 
@@ -1404,7 +1398,6 @@ bool print_stats()
 #ifndef USE_TILE_LOCAL
     assert_valid_cursor_pos();
 #endif
-    return has_changed;
 }
 
 static string _level_description_string_hud()
@@ -1496,16 +1489,18 @@ void redraw_screen(bool show_updates)
 
     draw_border();
 
-    you.redraw_title        = true;
-    you.redraw_hit_points   = true;
-    you.redraw_magic_points = true;
     you.redraw_stats.init(true);
+    you.redraw_title         = true;
+    you.redraw_hit_points    = true;
+    you.redraw_magic_points  = true;
     you.redraw_armour_class  = true;
     you.redraw_evasion       = true;
     you.redraw_experience    = true;
     you.wield_change         = true;
     you.redraw_quiver        = true;
     you.redraw_status_lights = true;
+    you.redraw_noise         = true;
+    you.gear_change          = true;
 
     print_stats();
 
index ea65ff0..d3e85f4 100644 (file)
@@ -13,7 +13,7 @@ void reset_hud();
 
 void update_turn_count();
 
-bool print_stats();
+void print_stats();
 void print_stats_level();
 void draw_border();
 
index 7f6d6cc..95a1965 100644 (file)
@@ -64,6 +64,7 @@ void equip_item(equipment_type slot, int item_slot, bool msg)
     ash_check_bondage();
     if (you.equip[slot] != -1 && you.inv[you.equip[slot]].cursed())
         auto_id_inventory();
+    you.gear_change = true;
 }
 
 // Clear an equipment slot (possibly melded).
@@ -85,6 +86,7 @@ bool unequip_item(equipment_type slot, bool msg)
             you.melded.set(slot, false);
         ash_check_bondage();
         you.last_unequip = item_slot;
+        you.gear_change = true;
         return true;
     }
 }
@@ -100,6 +102,7 @@ bool meld_slot(equipment_type slot)
     if (you.equip[slot] != -1 && !you.melded[slot])
     {
         you.melded.set(slot);
+        you.gear_change = true;
         return true;
     }
     return false;
@@ -115,6 +118,7 @@ bool unmeld_slot(equipment_type slot)
     if (you.equip[slot] != -1 && you.melded[slot])
     {
         you.melded.set(slot, false);
+        you.gear_change = true;
         return true;
     }
     return false;
index 2db4b85..e390b1d 100644 (file)
@@ -5069,6 +5069,8 @@ player::player()
     banished         = false;
 
     wield_change         = false;
+    gear_change          = false;
+    redraw_noise         = false;
     redraw_quiver        = false;
     redraw_status_lights = false;
     redraw_hit_points    = false;
index e3a1cdb..6c796e9 100644 (file)
@@ -415,8 +415,11 @@ public:
     // If true, player has triggered a trap effect by exploring.
     bool trapped;
 
+    // TODO burn this API with fire
     bool wield_change;          // redraw weapon
+    bool gear_change;           // redraw equip bar
     bool redraw_quiver;         // redraw quiver
+    bool redraw_noise;
 
     bool redraw_title;
     bool redraw_hit_points;
index 5e78e57..ff21f67 100644 (file)
@@ -309,7 +309,9 @@ static void _post_init(bool newc)
     you.redraw_evasion      = true;
     you.redraw_experience   = true;
     you.redraw_quiver       = true;
+    you.redraw_noise        = true;
     you.wield_change        = true;
+    you.gear_change         = true;
 
     // Start timer on session.
     you.last_keypress_time = chrono::system_clock::now();