From 02cfd131ee3ab94e2437e8f23877631a2bb16213 Mon Sep 17 00:00:00 2001 From: PatR Date: Mon, 24 Dec 2018 18:43:51 -0800 Subject: [PATCH] status gold vs symset:Blank Symset:Blank sets all the map symbols (except STRANGE_OBJECT) to . The status lines for !STATUS_HILITES force status to use '$' instead of ' ' for the prefix before ":1234" for gold, but the status lines for STATUS_HILITES did not. tty ended up with ":1234" for gold. win32 and curses both ignore the prefix and construct their own, but since win32 uses the map symbol for that it must also be ending up with ":1234" (I assume; I haven't seen it). curses is forcing '$' for the prefix, even on the rogue level. This attempts to fix win32 without be able to test the result. I've left curses alone. --- doc/fixes36.2 | 2 ++ src/botl.c | 31 ++++++++++----------- win/tty/wintty.c | 66 ++++++++++++++++++++++++--------------------- win/win32/mswproc.c | 21 +++++++++------ 4 files changed, 64 insertions(+), 56 deletions(-) diff --git a/doc/fixes36.2 b/doc/fixes36.2 index dbe5691c9..14f45097e 100644 --- a/doc/fixes36.2 +++ b/doc/fixes36.2 @@ -337,6 +337,8 @@ a config file line with OPTIONS=symset:default, roguesymset:RogueEpyx during the processing of symset:default done after RogueEpyx had already been processed avoid potential segfault when doing 'more information' lookup +when built with STATUS_HILITES enabled (the default), gold on status line + was missing '$' prefix for symset:Blank tty: turn off an optimization that is the suspected cause of Windows reported partial status lines following level changes tty: ensure that current status fields are always copied to prior status diff --git a/src/botl.c b/src/botl.c index 4fea3b64b..d8244734d 100644 --- a/src/botl.c +++ b/src/botl.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 botl.c $NHDT-Date: 1544917592 2018/12/15 23:46:32 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.131 $ */ +/* NetHack 3.6 botl.c $NHDT-Date: 1545705812 2018/12/25 02:43:32 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.132 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Michael Allison, 2006. */ /* NetHack may be freely redistributed. See license for details. */ @@ -38,6 +38,14 @@ get_strength_str() return buf; } +void +check_gold_symbol() +{ + nhsym goldch = showsyms[COIN_CLASS + SYM_OFF_O]; + + iflags.invis_goldsym = (goldch <= (nhsym) ' '); +} + char * do_statusline1() { @@ -87,17 +95,6 @@ do_statusline1() return newbot1; } -void -check_gold_symbol() -{ - int goldch, goldoc; - unsigned int goldos; - int goldglyph = objnum_to_glyph(GOLD_PIECE); - - (void) mapglyph(goldglyph, &goldch, &goldoc, &goldos, 0, 0); - iflags.invis_goldsym = ((char) goldch <= ' '); -} - char * do_statusline2() { @@ -126,7 +123,7 @@ do_statusline2() money = 0L; /* ought to issue impossible() and then discard gold */ Sprintf(eos(dloc), "%s:%-2ld", /* strongest hero can lift ~300000 gold */ (iflags.in_dumplog || iflags.invis_goldsym) ? "$" - : encglyph(objnum_to_glyph(GOLD_PIECE)), + : encglyph(objnum_to_glyph(GOLD_PIECE)), min(money, 999999L)); dln = strlen(dloc); /* '$' encoded as \GXXXXNNNN is 9 chars longer than display will need */ @@ -623,7 +620,8 @@ bot_via_windowport() * sequence. */ Sprintf(blstats[idx][BL_GOLD].val, "%s:%ld", - encglyph(objnum_to_glyph(GOLD_PIECE)), + (iflags.in_dumplog || iflags.invis_goldsym) ? "$" + : encglyph(objnum_to_glyph(GOLD_PIECE)), blstats[idx][BL_GOLD].a.a_long); valset[BL_GOLD] = TRUE; /* indicate val already set */ @@ -727,8 +725,7 @@ boolean *valsetlist; * * Also, even if context.rndencode hasn't changed and the * gold amount itself hasn't changed, the glyph portion of the - * encoding may have changed if a new symset was put into - * effect. + * encoding may have changed if a new symset was put into effect. * * \GXXXXNNNN:25 * XXXX = the context.rndencode portion @@ -751,7 +748,7 @@ boolean *valsetlist; if (!update_all && !chg) { reset = hilite_reset_needed(prev, bl_hilite_moves); if (reset) - curr->time = prev->time = 0L; + curr->time = prev->time = 0L; } #endif diff --git a/win/tty/wintty.c b/win/tty/wintty.c index ca9d60c1d..6116c467f 100644 --- a/win/tty/wintty.c +++ b/win/tty/wintty.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 wintty.c $NHDT-Date: 1544919891 2018/12/16 00:24:51 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.189 $ */ +/* NetHack 3.6 wintty.c $NHDT-Date: 1545705819 2018/12/25 02:43:39 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.190 $ */ /* Copyright (c) David Cohrs, 1991 */ /* NetHack may be freely redistributed. See license for details. */ @@ -497,7 +497,7 @@ tty_player_selection() goto give_up; } -makepicks: + makepicks: nextpick = RS_ROLE; do { if (nextpick == RS_ROLE) { @@ -965,7 +965,7 @@ makepicks: tty_display_nhwindow(BASE_WINDOW, FALSE); return; -give_up: + give_up: /* Quit */ if (selected) free((genericptr_t) selected); /* [obsolete] */ @@ -1243,11 +1243,11 @@ tty_askname() } #if defined(UNIX) || defined(VMS) if (c != '-' && c != '@') - if (!(c >= 'a' && c <= 'z') && !(c >= 'A' && c <= 'Z') && + if (!(c >= 'a' && c <= 'z') && !(c >= 'A' && c <= 'Z') /* reject leading digit but allow digits elsewhere (avoids ambiguity when character name gets appended to uid to construct save file name) */ - !(c >= '0' && c <= '9' && ct > 0)) + && !(c >= '0' && c <= '9' && ct > 0)) c = '_'; #endif if (ct < (int) (sizeof plname) - 1) { @@ -1478,16 +1478,18 @@ winid window; struct WinDesc *cw; boolean clear; { - if (cw->offx == 0) + if (cw->offx == 0) { if (cw->offy) { tty_curs(window, 1, 0); cl_eos(); - } else if (clear) + } else if (clear) { clear_screen(); - else + } else { docrt(); - else + } + } else { docorner((int) cw->offx, cw->maxrow + 1); + } } STATIC_OVL void @@ -2115,7 +2117,7 @@ struct WinDesc *cw; tty_nhbell(); break; } else if (index(gacc, morc)) { - group_accel: + group_accel: /* group accelerator; for the PICK_ONE case, we know that it matches exactly one item in order to be in gacc[] */ invert_all(window, page_start, page_end, morc); @@ -3396,15 +3398,16 @@ tty_nhgetch() if (WIN_MESSAGE != WIN_ERR && wins[WIN_MESSAGE]) wins[WIN_MESSAGE]->flags &= ~WIN_STOP; if (iflags.debug_fuzzer) { - i = randomkey(); + i = randomkey(); } else { #ifdef UNIX - i = (++nesting == 1) ? tgetch() - : (read(fileno(stdin), (genericptr_t) &nestbuf, 1) - == 1) ? (int) nestbuf : EOF; - --nesting; + i = (++nesting == 1) + ? tgetch() + : (read(fileno(stdin), (genericptr_t) &nestbuf, 1) == 1) + ? (int) nestbuf : EOF; + --nesting; #else - i = tgetch(); + i = tgetch(); #endif } if (!i) @@ -3617,7 +3620,7 @@ static boolean truncation_expected = FALSE; * for all platforms eventually and the conditional * setting below can be removed. */ -static int do_field_opt = +static int do_field_opt = #if defined(DISABLE_TTY_FIELD_OPT) 0; #else @@ -3684,11 +3687,11 @@ boolean enable; * BL_XP, BL_AC, BL_HD, BL_TIME, BL_HUNGER, BL_HP, BL_HPMAX, * BL_LEVELDESC, BL_EXP, BL_CONDITION * -- fldindex could also be BL_FLUSH (-1), which is not really - * a field index, but is a special trigger to tell the + * a field index, but is a special trigger to tell the * windowport that it should output all changes received * to this point. It marks the end of a bot() cycle. * -- fldindex could also be BL_RESET (-3), which is not really - * a field index, but is a special advisory to to tell the + * a field index, but is a special advisory to to tell the * windowport that it should redisplay all its status fields, * even if no changes have been presented to it. * -- ptr is usually a "char *", unless fldindex is BL_CONDITION. @@ -3707,7 +3710,7 @@ boolean enable; * BL_MASK_LEV 0x00000400L * BL_MASK_FLY 0x00000800L * BL_MASK_RIDE 0x00001000L - * -- The value passed for BL_GOLD includes an encoded leading + * -- The value passed for BL_GOLD usually includes an encoded leading * symbol for GOLD "\GXXXXNNNN:nnn". If the window port needs to use * the textual gold amount without the leading "$:" the port will * have to skip past ':' in the passed "ptr" for the BL_GOLD case. @@ -3739,8 +3742,7 @@ unsigned long *colormasks; int i; long *condptr = (long *) ptr; char *text = (char *) ptr; - char *lastchar = (char *) 0; - char *fval = (char *) 0; + char *fval, *lastchar, *p; boolean reset_state = NO_RESET; if ((fldidx < BL_RESET) || (fldidx >= MAXBLSTATS)) @@ -3787,8 +3789,9 @@ unsigned long *colormasks; /* The core botl engine sends a single blank to the window port for carrying-capacity when its unused. Let's suppress that */ - if (fldidx >= 0 && fldidx < MAXBLSTATS && - tty_status[NOW][fldidx].lth == 1 && status_vals[fldidx][0] == ' ') { + if (fldidx >= 0 && fldidx < MAXBLSTATS + && tty_status[NOW][fldidx].lth == 1 + && status_vals[fldidx][0] == ' ') { status_vals[fldidx][0] = '\0'; tty_status[NOW][fldidx].lth = 0; } @@ -3801,7 +3804,8 @@ unsigned long *colormasks; hpbar_percent = percent; hpbar_color = (color & 0x00FF); } - if (iflags.wc2_hitpointbar && (tty_procs.wincap2 & WC2_FLUSH_STATUS) != 0L) { + if (iflags.wc2_hitpointbar + && (tty_procs.wincap2 & WC2_FLUSH_STATUS) != 0L) { tty_status[NOW][BL_TITLE].color = hpbar_color; tty_status[NOW][BL_TITLE].dirty = TRUE; } @@ -3824,7 +3828,9 @@ unsigned long *colormasks; tty_status[NOW][fldidx].lth += 2; /* '[' and ']' */ break; case BL_GOLD: - tty_status[NOW][fldidx].lth -= (10 - 1); /* \GXXXXNNNN counts as 1 */ + /* \GXXXXNNNN counts as 1 */ + if ((p = index(status_vals[fldidx], '\\')) != 0 && p[1] == 'G') + tty_status[NOW][fldidx].lth -= (10 - 1); break; case BL_CAP: fval = status_vals[fldidx]; @@ -3859,7 +3865,7 @@ do_setlast() last_on_row[row] = fld; break; - } + } } STATIC_OVL int @@ -3942,7 +3948,7 @@ int *topsz, *bottomsz; tty_status[NOW][idx].y = row; tty_status[NOW][idx].x = col; - /* On a change to the field length, everything + /* On a change to the field length, everything further to the right must be updated as well */ if (tty_status[NOW][idx].lth != tty_status[BEFORE][idx].lth) update_right = TRUE; @@ -4395,8 +4401,7 @@ render_status(VOID_ARGS) if (coloridx != NO_COLOR && coloridx != CLR_MAX) term_start_color(coloridx); } - tty_putstatusfield(&tty_status[NOW][idx], - text, x, y); + tty_putstatusfield(&tty_status[NOW][idx], text, x, y); if (iflags.hilite_delta) { if (coloridx != NO_COLOR && coloridx != CLR_MAX) term_end_color(); @@ -4445,4 +4450,3 @@ render_status(VOID_ARGS) #endif /* TTY_GRAPHICS */ /*wintty.c*/ - diff --git a/win/win32/mswproc.c b/win/win32/mswproc.c index 8393ea3e0..8c37b3fd5 100644 --- a/win/win32/mswproc.c +++ b/win/win32/mswproc.c @@ -1,4 +1,4 @@ -/* 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 $ */ +/* NetHack 3.6 mswproc.c $NHDT-Date: 1545705822 2018/12/25 02:43:42 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.130 $ */ /* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ @@ -3084,24 +3084,29 @@ mswin_status_update(int idx, genericptr_t ptr, int chg, int percent, int color, case BL_GOLD: { char buf[BUFSZ]; char *p; + ZeroMemory(buf, sizeof(buf)); - mapglyph(objnum_to_glyph(GOLD_PIECE), &ochar, &ocolor, &ospecial, - 0, 0); + if (iflags.invis_goldsym) + ochar = GOLD_SYM; + else + mapglyph(objnum_to_glyph(GOLD_PIECE), + &ochar, &ocolor, &ospecial, 0, 0); buf[0] = ochar; p = strchr(text, ':'); if (p) { strncpy(buf + 1, p, sizeof(buf) - 2); } else { buf[1] = ':'; - strncpy(buf + 2, text, sizeof(buf) - 2); + strncpy(buf + 2, text, sizeof(buf) - 3); } - - Sprintf(status_field->string, status_field->format ? status_field->format : "%s", buf); + buf[sizeof buf - 1] = '\0'; + Sprintf(status_field->string, + status_field->format ? status_field->format : "%s", buf); nhassert(status_string->str == status_field->string); } break; default: { - Sprintf(status_field->string, status_field->format ? status_field->format : "%s", - text); + Sprintf(status_field->string, + status_field->format ? status_field->format : "%s", text); nhassert(status_string->str == status_field->string); } break; } -- 2.40.0