From 64c1f83dd8144a787ba7562b1ed25a0d0cb56bc8 Mon Sep 17 00:00:00 2001 From: PatR Date: Thu, 23 Jun 2022 13:03:32 -0700 Subject: [PATCH] tty perm_invent: fix right-hand panel Introducing 'maxslot' at the last second invalidated a ton of prior testing. This should fix all the modes of tty perm_invent, including the missing bottom boundary for TTYINV=4 (show in-use items only, an approximation of Qt's "paper doll" and of the '*' command). The boundary box characters are set using cmap_to_glyph(S_) which in theory makes them change depending on which branch of the dungeon the hero is in. That isn't noticeable since they aren't drawn as tiles, but it doesn't seem right. --- include/wintty.h | 6 ++--- win/tty/wintty.c | 67 +++++++++++++++++++++++++++++------------------- 2 files changed, 44 insertions(+), 29 deletions(-) diff --git a/include/wintty.h b/include/wintty.h index 0baa4477f..55d86f61a 100644 --- a/include/wintty.h +++ b/include/wintty.h @@ -1,4 +1,4 @@ -/* NetHack 3.7 wintty.h $NHDT-Date: 1596498572 2020/08/03 23:49:32 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.44 $ */ +/* NetHack 3.7 wintty.h $NHDT-Date: 1656014599 2022/06/23 20:03:19 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.55 $ */ /* Copyright (c) David Cohrs, 1991,1992 */ /* NetHack may be freely redistributed. See license for details. */ @@ -12,9 +12,10 @@ #ifdef TTY_PERM_INVENT enum { tty_pi_minrow = 28, tty_pi_mincol = 79 }; +/* for static init of zerottycell, put pointer first */ union ttycellcontent { - char ttychar; glyph_info *gi; + char ttychar; }; struct tty_perminvent_cell { Bitfield(refresh, 1); @@ -24,7 +25,6 @@ struct tty_perminvent_cell { union ttycellcontent content; int32_t color; }; -extern struct tty_perminvent_cell zerottycell; #endif /* menu structure */ diff --git a/win/tty/wintty.c b/win/tty/wintty.c index 7a7bb1b86..23767760f 100644 --- a/win/tty/wintty.c +++ b/win/tty/wintty.c @@ -1,4 +1,4 @@ -/* NetHack 3.7 wintty.c $NHDT-Date: 1655932905 2022/06/22 21:21:45 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.303 $ */ +/* NetHack 3.7 wintty.c $NHDT-Date: 1656014602 2022/06/23 20:03:22 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.306 $ */ /* Copyright (c) David Cohrs, 1991 */ /* NetHack may be freely redistributed. See license for details. */ @@ -258,8 +258,7 @@ void tty_perm_invent_toggled(boolean negated); static int ttyinv_create_window(int, struct WinDesc *); static void tty_invent_box_glyph_init(struct WinDesc *cw); static boolean calling_from_update_inventory = FALSE; -/* this could/should be static */ -struct tty_perminvent_cell zerottycell = { 0, 0, 0, 0, { 0 } }; +static struct tty_perminvent_cell zerottycell = { 0, 0, 0, 0, { 0 } }; static glyph_info zerogi = { 0 }; enum { border_left, border_middle, border_right, border_elements }; static int bordercol[border_elements] = { 0, 0, 0 }; /* left, middle, right */ @@ -1732,6 +1731,7 @@ ttyinv_create_window(int newid, struct WinDesc *newwin) || c == bordercol[border_right]) { newwin->cells[r][c].content.gi = (glyph_info *) alloc(n); *newwin->cells[r][c].content.gi = zerogi; + newwin->cells[r][c].glyph = 1; } } @@ -2718,17 +2718,20 @@ tty_destroy_nhwindow(winid window) int r, c; if (cw->cells) { - for (r = 0; r < cw->maxrow; r++) - for (c = 0; c < cw->maxcol; c++) { - if (cw->cells[r][c].glyph) - free((genericptr_t) cw->cells[r][c].content.gi); - cw->cells[r][c] = zerottycell; - } - for (r = 0; r < cw->maxrow; r++) + for (r = 0; r < cw->maxrow; r++) { if (cw->cells[r]) { + for (c = 0; c < cw->maxcol; c++) { + /* glyph is a flag indicating whether content union + contains a glyph_info structure or just a char */ + if (cw->cells[r][c].glyph) + free((genericptr_t) cw->cells[r][c].content.gi); + cw->cells[r][c] = zerottycell; + cw->cells[r][c].glyph = 0; + } free((genericptr_t) cw->cells[r]); cw->cells[r] = (struct tty_perminvent_cell *) 0; } + } free((genericptr_t) cw->cells); cw->cells = (struct tty_perminvent_cell **) 0; cw->rows = cw->cols = 0; @@ -3513,9 +3516,10 @@ tty_update_inventory(int arg UNUSED) } text = Empty; /* lint suppression */ - maxslot = cw->maxrow - 1; + maxslot = ((int) cw->maxrow - 2) * (!inuse_only ? 2 : 1); obj = g.invent; for (slot = 0; slot < maxslot; ++slot) { + nxtlet = '?'; /* always gets set to something else if actually used */ if (!sparse) { while (obj && ((obj->invlet == GOLD_SYM && !show_gold) || (!obj->owornmask && inuse_only))) @@ -3691,31 +3695,38 @@ tty_invent_box_glyph_init(struct WinDesc *cw) for (row = 0; row < cw->maxrow; ++row) for (col = 0; col < cw->maxcol; ++col) { cell = &cw->cells[row][col]; + /* cell->glyph is a flag for whether the content union contains + a glyph_info structure rather than just a char */ + if (!cell->glyph) + continue; glyph = 0; + /* note: for top and bottom, check [border_right] before + [border_middle] because they could be the same and if so + we want corner rather than tee */ if (row == 0) { if (col == bordercol[border_left]) glyph = cmap_to_glyph(S_tlcorn); - else if ((col > bordercol[border_left] - && col < bordercol[border_middle]) - || (col > bordercol[border_middle] - && col < bordercol[border_right])) - glyph = cmap_to_glyph(S_hwall); - else if (col == bordercol[border_middle]) - glyph = cmap_to_glyph(S_tdwall); else if (col == bordercol[border_right]) glyph = cmap_to_glyph(S_trcorn); + else if (col == bordercol[border_middle]) + glyph = cmap_to_glyph(S_tdwall); + else /*if ((col > bordercol[border_left] + && col < bordercol[border_middle]) + || (col > bordercol[border_middle] + && col < bordercol[border_right]))*/ + glyph = cmap_to_glyph(S_hwall); } else if (row == (cw->maxrow - 1)) { if (col == bordercol[border_left]) glyph = cmap_to_glyph(S_blcorn); - else if ((col > bordercol[border_left] - && col < bordercol[border_middle]) - || (col > bordercol[border_middle] - && col < bordercol[border_right])) - glyph = cmap_to_glyph(S_hwall); - else if (col == bordercol[border_middle]) - glyph = cmap_to_glyph(S_tuwall); else if (col == bordercol[border_right]) glyph = cmap_to_glyph(S_brcorn); + else if (col == bordercol[border_middle]) + glyph = cmap_to_glyph(S_tuwall); + else /*if ((col > bordercol[border_left] + && col < bordercol[border_middle]) + || (col > bordercol[border_middle] + && col < bordercol[border_right]))*/ + glyph = cmap_to_glyph(S_hwall); } else { if (col == bordercol[border_left] || col == bordercol[border_middle] @@ -3735,8 +3746,12 @@ tty_invent_box_glyph_init(struct WinDesc *cw) #endif cell->content.gi->gm.sym.symidx != oldsymidx) cell->refresh = 1; - cell->glyph = 1; + cell->glyph = 1; /* (redundant) */ cell->text = 0; + } else { + /* we can only get here when cell->glyph is 1; + not assigning anything in that situation is a bug */ + impossible("tty invent: expected glyph"); } } done_tty_perm_invent_init = TRUE;