diff --git a/Files b/Files index 796b9c5bf..7a1a69974 100644 --- a/Files +++ b/Files @@ -43,13 +43,15 @@ tribute wizhelp yendor.des doc: (files for all versions) Guidebook.mn Guidebook.tex Guidebook.txt config.nh dgn_comp.6 -dgn_comp.txt dlb.6 dlb.txt fixes22.0 fixes30.0 -fixes31.1 fixes31.2 fixes31.3 fixes32.0 fixes32.1 -fixes32.2 fixes32.3 fixes33.0 fixes33.1 fixes34.0 -fixes34.1 fixes34.2 fixes34.3 fixes35.0 fixes36.0 -fixes36.1 fixes36.2 lev_comp.6 lev_comp.txt makedefs.6 -makedefs.txt nethack.6 nethack.txt recover.6 recover.txt -tmac.n window.doc +dgn_comp.txt dlb.6 dlb.txt fixes10.0 fixes14.f +fixes22.0 fixes23.e fixes30.0 fixes30.pl01 fixes30.pl02 +fixes30.pl03 fixes30.pl04 fixes30.pl05 fixes30.pl06 fixes30.pl07 +fixes30.pl08 fixes30.pl09 fixes30.pl10 fixes31.1 fixes31.2 +fixes31.3 fixes32.0 fixes32.1 fixes32.2 fixes32.3 +fixes33.0 fixes33.1 fixes34.0 fixes34.1 fixes34.2 +fixes34.3 fixes35.0 fixes36.0 fixes36.1 fixes36.2 +lev_comp.6 lev_comp.txt makedefs.6 makedefs.txt nethack.6 +nethack.txt recover.6 recover.txt tmac.n window.doc include: (files for GEM versions) @@ -217,9 +219,10 @@ snd86unx.shr sys/unix/hints: (files for configuring UNIX NetHack versions) -linux linux-chroot linux-qt4 linux-x11 macosx -macosx.sh macosx10.10 macosx10.5 macosx10.7 macosx10.8 -unix +linux linux-chroot linux-qt4 linux-qt5 +linux-x11 macosx macosx.sh macosx10.10 +macosx10.10-qt macosx10.5 macosx10.7 macosx10.8 +unix sys/vms: (files for VMS version) @@ -376,6 +379,32 @@ dat: (file generated by dgn_comp at playground creation time) dungeon +(files generated by lev_comp at playground creation time) +Arc-fila.lev Arc-filb.lev Arc-goal.lev Arc-loca.lev Arc-strt.lev +Bar-fila.lev Bar-filb.lev Bar-goal.lev Bar-loca.lev Bar-strt.lev +Cav-fila.lev Cav-filb.lev Cav-goal.lev Cav-loca.lev Cav-strt.lev +Hea-fila.lev Hea-filb.lev Hea-goal.lev Hea-loca.lev Hea-strt.lev +Kni-fila.lev Kni-filb.lev Kni-goal.lev Kni-loca.lev Kni-strt.lev +Mon-fila.lev Mon-filb.lev Mon-goal.lev Mon-loca.lev Mon-strt.lev +Pri-fila.lev Pri-filb.lev Pri-goal.lev Pri-loca.lev Pri-strt.lev +Ran-fila.lev Ran-filb.lev Ran-goal.lev Ran-loca.lev Ran-strt.lev +Rog-fila.lev Rog-filb.lev Rog-goal.lev Rog-loca.lev Rog-strt.lev +Sam-fila.lev Sam-filb.lev Sam-goal.lev Sam-loca.lev Sam-strt.lev +Tou-fila.lev Tou-filb.lev Tou-goal.lev Tou-loca.lev Tou-strt.lev +Val-fila.lev Val-filb.lev Val-goal.lev Val-loca.lev Val-strt.lev +Wiz-fila.lev Wiz-filb.lev Wiz-goal.lev Wiz-loca.lev Wiz-strt.lev +air.lev asmodeus.lev astral.lev baalz.lev bigrm-1.lev +bigrm-10.lev bigrm-2.lev bigrm-3.lev bigrm-4.lev bigrm-5.lev +bigrm-6.lev bigrm-7.lev bigrm-8.lev bigrm-9.lev castle.lev +earth.lev fakewiz1.lev fakewiz2.lev fire.lev juiblex.lev +knox.lev medusa-1.lev medusa-2.lev medusa-3.lev medusa-4.lev +minefill.lev minend-1.lev minend-2.lev minend-3.lev minetn-1.lev +minetn-2.lev minetn-3.lev minetn-4.lev minetn-5.lev minetn-6.lev +minetn-7.lev oracle.lev orcus.lev sanctum.lev soko1-1.lev +soko1-2.lev soko2-1.lev soko2-2.lev soko3-1.lev soko3-2.lev +soko4-1.lev soko4-2.lev tower1.lev tower2.lev tower3.lev +valley.lev water.lev wizard1.lev wizard2.lev wizard3.lev + (files generated by makedefs at playground creation time) data dungeon.pdf options oracles quest.dat rumors diff --git a/doc/fixes36.2 b/doc/fixes36.2 index a56ab4b9f..25fd65dc4 100644 --- a/doc/fixes36.2 +++ b/doc/fixes36.2 @@ -168,8 +168,9 @@ tty: turn off an optimization that is the suspected cause of Windows reported tty: ensure that current status fields are always copied to prior status values so that comparisons are correct tty: fix an out of bounds error in tty_status_update() for BL_HUNGER case -tty: fix leftover display artifact when last field on the row got smaller - and optimize so only the right-most field requires the cleanup code +tty: fix leftover display artifact when the last field on the row got placed + to the left of where it was previously due to it, or one of the fields + to its left, getting shorter X11: its use of genl_status_update exposed a negative index use that could lead to a segfault diff --git a/include/wintty.h b/include/wintty.h index 9a375145e..99b560d82 100644 --- a/include/wintty.h +++ b/include/wintty.h @@ -79,7 +79,7 @@ struct tty_status_fields { boolean valid; boolean dirty; boolean redraw; - boolean padright; + boolean last_on_row; }; #endif diff --git a/win/tty/wintty.c b/win/tty/wintty.c index 145a535fe..2794331c8 100644 --- a/win/tty/wintty.c +++ b/win/tty/wintty.c @@ -3541,7 +3541,8 @@ static enum statusfields fieldorder[2][MAX_PER_ROW] = { /* 2: two status lines * BL_CAP, BL_CONDITION, BL_FLUSH } }; -static int last_on_row[2]; +static int last_on_row[2]; /* [rows] */ +static int finalx[2][2]; /* [rows][NOW or BEFORE] */ static boolean setlast = FALSE; static boolean windowdata_init = FALSE; static int cond_shrinklvl = 0, cond_width_at_shrink = 0; @@ -3588,7 +3589,7 @@ tty_status_init() tty_status[NOW][i].valid = FALSE; tty_status[NOW][i].dirty = FALSE; tty_status[NOW][i].redraw = FALSE; - tty_status[NOW][i].padright = FALSE; + tty_status[NOW][i].last_on_row = FALSE; tty_status[BEFORE][i] = tty_status[NOW][i]; } tty_condition_bits = 0L; @@ -3883,12 +3884,11 @@ int *topsz, *bottomsz; /* 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) { + if (tty_status[NOW][idx].lth != tty_status[BEFORE][idx].lth) update_right = TRUE; - if ((tty_status[NOW][idx].lth < tty_status[BEFORE][idx].lth) && - idx == last_on_row[row]) - tty_status[NOW][idx].padright = TRUE; - } + + if (idx == last_on_row[row]) + tty_status[NOW][idx].last_on_row = TRUE; if (!update_right && !forcefields) { /* @@ -4176,22 +4176,22 @@ render_status(VOID_ARGS) for (row = 0; row < 2; ++row) { curs(WIN_STATUS, 1, row); for (i = 0; fieldorder[row][i] != BL_FLUSH; ++i) { - int fldidx = fieldorder[row][i]; + int idx = fieldorder[row][i]; - if (!status_activefields[fldidx]) + if (!status_activefields[idx]) continue; - if ((tty_status[NOW][fldidx].lth || fldidx == BL_CONDITION) - && (tty_status[NOW][fldidx].redraw || !do_field_opt)) { - int coloridx = tty_status[NOW][fldidx].color; - int attridx = tty_status[NOW][fldidx].attr; - int x = tty_status[NOW][fldidx].x; + if ((tty_status[NOW][idx].lth || idx == BL_CONDITION) + && (tty_status[NOW][idx].redraw || !do_field_opt)) { + int coloridx = tty_status[NOW][idx].color; + int attridx = tty_status[NOW][idx].attr; + int x = tty_status[NOW][idx].x; int y = row; - char *text = status_vals[fldidx]; - boolean hitpointbar = (fldidx == BL_TITLE + char *text = status_vals[idx]; + boolean hitpointbar = (idx == BL_TITLE && iflags.wc2_hitpointbar); - if (fldidx == BL_CONDITION) { + if (idx == BL_CONDITION) { /* * +-----------------+ * | Condition Codes | @@ -4235,7 +4235,7 @@ render_status(VOID_ARGS) } tty_curs(WIN_STATUS, x, y); cl_end(); - } else if (fldidx == BL_GOLD) { + } else if (idx == BL_GOLD) { char buf[BUFSZ]; /* * +-----------+ @@ -4312,7 +4312,7 @@ render_status(VOID_ARGS) } tty_putstatusfield(nullfield, "]", x++, y); } else { - tty_putstatusfield(&tty_status[NOW][fldidx], + tty_putstatusfield(&tty_status[NOW][idx], (char *) 0, x, y); } } else { @@ -4332,34 +4332,41 @@ render_status(VOID_ARGS) if (coloridx != NO_COLOR && coloridx != CLR_MAX) term_start_color(coloridx); } - tty_putstatusfield(&tty_status[NOW][fldidx], + tty_putstatusfield(&tty_status[NOW][idx], text, x, y); if (iflags.hilite_delta) { if (coloridx != NO_COLOR && coloridx != CLR_MAX) term_end_color(); End_Attr(attridx); } - if (tty_status[NOW][fldidx].padright) { - int cnt = tty_status[BEFORE][fldidx].lth - - tty_status[NOW][fldidx].lth; + } + if (tty_status[NOW][idx].last_on_row) { + int padright = 0; - x += (tty_status[NOW][fldidx].lth - 1); - while (cnt-- > 0) - tty_putstatusfield(nullfield, " ", x++, y); - } + x = tty_status[NOW][idx].x + tty_status[NOW][idx].lth; + finalx[row][NOW] = x - 1; + if (finalx[row][NOW] < finalx[row][BEFORE]) + padright = finalx[row][BEFORE] - finalx[row][NOW]; + while (padright-- > 0) + tty_putstatusfield(nullfield, " ", x++, y); } } /* reset .redraw, .dirty, .padright now that they've been rendered */ - tty_status[NOW][fldidx].dirty = FALSE; - tty_status[NOW][fldidx].redraw = FALSE; - tty_status[NOW][fldidx].padright = FALSE; + tty_status[NOW][idx].dirty = FALSE; + tty_status[NOW][idx].redraw = FALSE; + tty_status[NOW][idx].last_on_row = FALSE; /* - * Make a copy of the entire tty_status struct for comparison - * of current and previous. + * For comparison of current and previous: + * - Copy the entire tty_status struct. */ - tty_status[BEFORE][fldidx] = tty_status[NOW][fldidx]; + tty_status[BEFORE][idx] = tty_status[NOW][idx]; } + /* + * For comparison of current and previous: + * - Copy the last written column number on the row. + */ + finalx[row][BEFORE] = finalx[row][NOW]; } if (cond_disp_width[NOW] < cond_width_at_shrink) { cond_shrinklvl = 0; /* reset */