Merge branch 'NetHack-3.6'
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.8 $ $NHDT-Date: 1558248715 2019/05/19 06:51:55 $
|
||||
$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.10 $ $NHDT-Date: 1558355176 2019/05/20 12:26:16 $
|
||||
|
||||
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,
|
||||
@@ -35,6 +35,10 @@ curses: if message window is only one line, cancelling some prompts with ESC
|
||||
left the prompts visible on the message line instead of erasing them
|
||||
curses: support EDIT_GETLIN (but like with tty, it's disabled by default) to
|
||||
pre-load an earlier response as the default answer for some prompts
|
||||
tty: re-do one optimization used when status conditions have all been removed
|
||||
and remove another that tried to check whether condition text to be
|
||||
displayed next was the same as the existing value; sometimes new
|
||||
status condition wouldn't be shown unless a screen redraw was forced
|
||||
Windows: some startup error messages were not being delivered successfully
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* NetHack 3.6 wintty.h $NHDT-Date: 1553858470 2019/03/29 11:21:10 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.33 $ */
|
||||
/* NetHack 3.6 wintty.h $NHDT-Date: 1558330405 2019/05/20 05:33:25 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.34 $ */
|
||||
/* Copyright (c) David Cohrs, 1991,1992 */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
|
||||
@@ -79,7 +79,7 @@ struct tty_status_fields {
|
||||
boolean valid;
|
||||
boolean dirty;
|
||||
boolean redraw;
|
||||
boolean _not_used; /* was 'last_in_row' */
|
||||
boolean sanitycheck; /* was 'last_in_row' */
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
@@ -91,9 +91,13 @@ DEBUGINFO = Y
|
||||
|
||||
#
|
||||
#==============================================================================
|
||||
#
|
||||
# The version of the game this Makefile was designed for
|
||||
NETHACK_VERSION="3.6.3"
|
||||
|
||||
# Set the gamedir according to your preference.
|
||||
# If not present prior to compilation it gets created.
|
||||
# A brief version for use in macros
|
||||
NHV=$(NETHACK_VERSION:.=)
|
||||
NHV=$(NHV:"=)
|
||||
|
||||
#
|
||||
# Source directories. Makedefs hardcodes these, don't change them.
|
||||
@@ -549,7 +553,7 @@ lflagsBuild = $(lflags) $(conlibs) $(MACHINE)
|
||||
LIBS= user32.lib winmm.lib $(ZLIB) $(CURSESLIB)
|
||||
|
||||
! IF ("$(USE_DLB)"=="Y")
|
||||
DLB = nhdat
|
||||
DLB = nhdat$(NHV)
|
||||
! ELSE
|
||||
DLB =
|
||||
! ENDIF
|
||||
@@ -673,7 +677,7 @@ install: $(O)envchk.tag $(O)obj.tag $(O)utility.tag $(GAMEDIR)\NetHack.exe $(GAM
|
||||
$(O)install.tag: $(DAT)\data $(DAT)\rumors $(DAT)\dungeon \
|
||||
$(DAT)\oracles $(DAT)\quest.dat $(O)sp_lev.tag $(DLB)
|
||||
! IF ("$(USE_DLB)"=="Y")
|
||||
copy nhdat* $(GAMEDIR)
|
||||
copy nhdat$(NHV) $(GAMEDIR)
|
||||
copy $(DAT)\license $(GAMEDIR)
|
||||
copy $(DAT)\opthelp $(GAMEDIR)
|
||||
! ELSE
|
||||
@@ -1100,7 +1104,7 @@ $(O)envchk.tag: $(O)obj.tag
|
||||
#==========================================
|
||||
|
||||
#==========================================
|
||||
# DLB utility and nhdat file creation
|
||||
# DLB utility and nhdatNNN file creation
|
||||
#==========================================
|
||||
|
||||
$(U)dlb_main.exe: $(DLBOBJ) $(O)dlb.o
|
||||
@@ -1121,7 +1125,7 @@ $(O)dlb_main.o: $(UTIL)\dlb_main.c $(INCL)\config.h $(INCL)\dlb.h
|
||||
$(DAT)\porthelp: $(MSWSYS)\porthelp
|
||||
@copy $(MSWSYS)\porthelp $@ >nul
|
||||
|
||||
nhdat: $(U)dlb_main.exe $(DAT)\data $(DAT)\oracles $(OPTIONS_FILE) \
|
||||
nhdat$(NHV): $(U)dlb_main.exe $(DAT)\data $(DAT)\oracles $(OPTIONS_FILE) \
|
||||
$(DAT)\quest.dat $(DAT)\rumors $(DAT)\help $(DAT)\hh $(DAT)\cmdhelp $(DAT)\keyhelp \
|
||||
$(DAT)\history $(DAT)\opthelp $(DAT)\wizhelp $(DAT)\dungeon $(DAT)\porthelp \
|
||||
$(DAT)\license $(DAT)\engrave $(DAT)\epitaph $(DAT)\bogusmon $(DAT)\tribute $(O)sp_lev.tag
|
||||
@@ -1281,7 +1285,7 @@ spotless: clean
|
||||
if exist $(GAMEDIR)\nhraykey.dll del $(GAMEDIR)\nhraykey.dll
|
||||
if exist $(GAMEDIR)\NetHack.exe del $(GAMEDIR)\NetHack.exe
|
||||
if exist $(GAMEDIR)\NetHack.pdb del $(GAMEDIR)\NetHack.pdb
|
||||
if exist $(GAMEDIR)\nhdat* del $(GAMEDIR)\nhdat*
|
||||
if exist $(GAMEDIR)\nhdat$(NHV) del $(GAMEDIR)\nhdat$(NHV)
|
||||
! ENDIF
|
||||
if exist $(INCL)\date.h del $(INCL)\date.h
|
||||
if exist $(INCL)\onames.h del $(INCL)\onames.h
|
||||
@@ -1334,7 +1338,7 @@ spotless: clean
|
||||
if exist $(DAT)\porthelp del $(DAT)\porthelp
|
||||
if exist $(O)sp_lev.tag del $(O)sp_lev.tag
|
||||
if exist $(SRC)\vis_tab.c del $(SRC)\vis_tab.c
|
||||
if exist nhdat*. del nhdat*.
|
||||
if exist nhdat$(NHV). del nhdat$(NHV).
|
||||
if exist $(O)obj.tag del $(O)obj.tag
|
||||
if exist $(O)gamedir.tag del $(O)gamedir.tag
|
||||
if exist $(O)nh*key.lib del $(O)nh*key.lib
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* NetHack 3.6 wintty.c $NHDT-Date: 1557088734 2019/05/05 20:38:54 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.203 $ */
|
||||
/* NetHack 3.6 wintty.c $NHDT-Date: 1558355176 2019/05/20 12:26:16 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.206 $ */
|
||||
/* Copyright (c) David Cohrs, 1991 */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
|
||||
@@ -208,6 +208,9 @@ STATIC_DCL int NDECL(condition_size);
|
||||
STATIC_DCL int FDECL(make_things_fit, (BOOLEAN_P));
|
||||
STATIC_DCL void FDECL(shrink_enc, (int));
|
||||
STATIC_DCL void FDECL(shrink_dlvl, (int));
|
||||
#if (NH_DEVEL_STATUS != NH_STATUS_RELEASED)
|
||||
STATIC_DCL void NDECL(status_sanity_check);
|
||||
#endif /* NH_DEVEL_STATUS */
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -3617,9 +3620,11 @@ char *posbar;
|
||||
*
|
||||
* render_status
|
||||
*
|
||||
* Goes through each of the two status row's fields and
|
||||
* Goes through each of the status row's fields and
|
||||
* calls tty_putstatusfield() to place them on the display.
|
||||
* ->tty_putstatusfield()
|
||||
* At the end of the for-loop, the NOW values get copied
|
||||
* to BEFORE values.
|
||||
*
|
||||
* tty_putstatusfield()
|
||||
*
|
||||
@@ -3746,6 +3751,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].sanitycheck = FALSE;
|
||||
tty_status[BEFORE][i] = tty_status[NOW][i];
|
||||
}
|
||||
tty_condition_bits = 0L;
|
||||
@@ -3849,8 +3855,12 @@ unsigned long *colormasks;
|
||||
reset_state = FORCE_RESET;
|
||||
/*FALLTHRU*/
|
||||
case BL_FLUSH:
|
||||
if (make_things_fit(reset_state) || truncation_expected)
|
||||
if (make_things_fit(reset_state) || truncation_expected) {
|
||||
render_status();
|
||||
#if (NH_DEVEL_STATUS != NH_STATUS_RELEASED)
|
||||
status_sanity_check();
|
||||
#endif
|
||||
}
|
||||
return;
|
||||
case BL_CONDITION:
|
||||
tty_status[NOW][fldidx].idx = fldidx;
|
||||
@@ -3858,6 +3868,7 @@ unsigned long *colormasks;
|
||||
tty_colormasks = colormasks;
|
||||
tty_status[NOW][fldidx].valid = TRUE;
|
||||
tty_status[NOW][fldidx].dirty = TRUE;
|
||||
tty_status[NOW][fldidx].sanitycheck = TRUE;
|
||||
truncation_expected = FALSE;
|
||||
break;
|
||||
case BL_GOLD:
|
||||
@@ -3885,6 +3896,7 @@ unsigned long *colormasks;
|
||||
tty_status[NOW][fldidx].lth = strlen(status_vals[fldidx]);
|
||||
tty_status[NOW][fldidx].valid = TRUE;
|
||||
tty_status[NOW][fldidx].dirty = TRUE;
|
||||
tty_status[NOW][fldidx].sanitycheck = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -4055,10 +4067,10 @@ int sz[3];
|
||||
* - Is the additional processing time for this worth it?
|
||||
*/
|
||||
if (do_field_opt
|
||||
/* These color/attr checks aren't right for
|
||||
'condition'; is it safe to assume that same text
|
||||
means same highlighting for that field? If not,
|
||||
we'd end up redrawing conditions every time. */
|
||||
/* color/attr checks aren't right for 'condition'
|
||||
and neither is examining status_vals[BL_CONDITION]
|
||||
so skip same-contents optimization for conditions */
|
||||
&& idx != BL_CONDITION
|
||||
&& (tty_status[NOW][idx].color
|
||||
== tty_status[BEFORE][idx].color)
|
||||
&& (tty_status[NOW][idx].attr
|
||||
@@ -4108,6 +4120,52 @@ int sz[3];
|
||||
return valid;
|
||||
}
|
||||
|
||||
#if (NH_DEVEL_STATUS != NH_STATUS_RELEASED)
|
||||
STATIC_OVL void
|
||||
status_sanity_check(VOID_ARGS)
|
||||
{
|
||||
int i;
|
||||
static boolean in_sanity_check = FALSE;
|
||||
static const char *const idxtext[] = {
|
||||
"BL_TITLE", "BL_STR", "BL_DX", "BL_CO", "BL_IN", "BL_WI", /* 0.. 5 */
|
||||
"BL_CH","BL_ALIGN", "BL_SCORE", "BL_CAP", "BL_GOLD", /* 6.. 10 */
|
||||
"BL_ENE", "BL_ENEMAX", "BL_XP", "BL_AC", "BL_HD", /* 11.. 15 */
|
||||
"BL_TIME", "BL_HUNGER", "BL_HP", "BL_HPMAX", /* 16.. 19 */
|
||||
"BL_LEVELDESC", "BL_EXP", "BL_CONDITION" /* 20.. 22 */
|
||||
};
|
||||
|
||||
if (in_sanity_check)
|
||||
return;
|
||||
in_sanity_check = TRUE;
|
||||
/*
|
||||
* Make sure that every field made it down to the
|
||||
* bottom of the render_status() for-loop.
|
||||
*/
|
||||
for (i = 0; i < MAXBLSTATS; ++i) {
|
||||
if (tty_status[NOW][i].sanitycheck) {
|
||||
char panicmsg[BUFSZ];
|
||||
|
||||
Sprintf(panicmsg, "failed on tty_status[NOW][%s].", idxtext[i]);
|
||||
paniclog("status_sanity_check", panicmsg);
|
||||
tty_status[NOW][i].sanitycheck = FALSE;
|
||||
/*
|
||||
* Attention developers: If you encounter the above
|
||||
* message in paniclog, it almost certainly means that
|
||||
* a recent code change has caused a failure to reach
|
||||
* the bottom of render_status(), at least for the BL_
|
||||
* field identified in the impossible() message.
|
||||
*
|
||||
* That could be because of the addition of a continue
|
||||
* statement within the render_status() for-loop, or a
|
||||
* premature return from render_status() before it finished
|
||||
* its housekeeping chores.
|
||||
*/
|
||||
}
|
||||
}
|
||||
in_sanity_check = FALSE;
|
||||
}
|
||||
#endif /* NHDEVEL_STATUS */
|
||||
|
||||
/*
|
||||
* This is what places a field on the tty display.
|
||||
*/
|
||||
@@ -4330,8 +4388,8 @@ render_status(VOID_ARGS)
|
||||
if (!status_activefields[idx])
|
||||
continue;
|
||||
x = tty_status[NOW][idx].x;
|
||||
text = status_vals[idx];
|
||||
tlth = (int) tty_status[NOW][idx].lth;
|
||||
text = status_vals[idx]; /* always "" for BL_CONDITION */
|
||||
tlth = (int) tty_status[NOW][idx].lth; /* valid for BL_CONDITION */
|
||||
|
||||
if (tty_status[NOW][idx].redraw || !do_field_opt) {
|
||||
boolean hitpointbar = (idx == BL_TITLE
|
||||
@@ -4343,9 +4401,11 @@ render_status(VOID_ARGS)
|
||||
* | Condition Codes |
|
||||
* +-----------------+
|
||||
*/
|
||||
if (!tty_condition_bits)
|
||||
continue;
|
||||
if (num_rows == 3) {
|
||||
bits = tty_condition_bits;
|
||||
/* if no bits are set, we can fall through condition
|
||||
rendering code to finalx[] handling (and subsequent
|
||||
rest-of-line erasure if line is shorter than before) */
|
||||
if (num_rows == 3 && bits != 0L) {
|
||||
int k;
|
||||
char *dat = &cw->data[y][0];
|
||||
|
||||
@@ -4372,8 +4432,7 @@ render_status(VOID_ARGS)
|
||||
tty_status[NOW][BL_CONDITION].x = x;
|
||||
tty_curs(WIN_STATUS, x, y);
|
||||
}
|
||||
bits = tty_condition_bits;
|
||||
for (c = 0; c < SIZE(conditions); ++c) {
|
||||
for (c = 0; c < SIZE(conditions) && bits != 0L; ++c) {
|
||||
mask = conditions[c].mask;
|
||||
if (bits & mask) {
|
||||
const char *condtext;
|
||||
@@ -4389,8 +4448,10 @@ render_status(VOID_ARGS)
|
||||
condtext = conditions[c].text[cond_shrinklvl];
|
||||
if (x >= cw->cols && !truncation_expected) {
|
||||
impossible(
|
||||
"Unexpected condition placement overflow");
|
||||
"Unexpected condition placement overflow for \"%s\"",
|
||||
condtext);
|
||||
condtext = "";
|
||||
bits = 0L; /* skip any remaining conditions */
|
||||
}
|
||||
tty_putstatusfield(condtext, x, y);
|
||||
x += (int) strlen(condtext);
|
||||
@@ -4399,8 +4460,7 @@ render_status(VOID_ARGS)
|
||||
term_end_color();
|
||||
End_Attr(attrmask);
|
||||
}
|
||||
if (!(bits &= ~mask))
|
||||
break;
|
||||
bits &= ~mask;
|
||||
}
|
||||
}
|
||||
/* 'x' is 1-based and 'cols' and 'data' are 0-based,
|
||||
@@ -4501,9 +4561,10 @@ render_status(VOID_ARGS)
|
||||
x += tlth;
|
||||
}
|
||||
finalx[row][NOW] = x - 1;
|
||||
/* reset .redraw and .dirty now that they're rendered */
|
||||
/* reset .redraw and .dirty now that field has been rendered */
|
||||
tty_status[NOW][idx].dirty = FALSE;
|
||||
tty_status[NOW][idx].redraw = FALSE;
|
||||
tty_status[NOW][idx].sanitycheck = FALSE;
|
||||
/*
|
||||
* For comparison of current and previous:
|
||||
* - Copy the entire tty_status struct.
|
||||
|
||||
Reference in New Issue
Block a user