Merge branch 'NetHack-3.6'

This commit is contained in:
nhmall
2019-10-06 09:16:23 -04:00
14 changed files with 91 additions and 87 deletions

View File

@@ -1,4 +1,4 @@
$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.124 $ $NHDT-Date: 1570232224 2019/10/04 23:37:04 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.125 $ $NHDT-Date: 1570318925 2019/10/05 23:42:05 $
This fixes36.3 file is here to capture information about updates in the 3.6.x 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, lineage following the release of 3.6.2 in May 2019. Please note, however,
@@ -173,6 +173,10 @@ avoid 'object lost' panic when polymorph causes loss of levitation boots or
disrobing/dropping in order to crawl out chooses to drop those boots disrobing/dropping in order to crawl out chooses to drop those boots
'sortloot's attempt to group musical instruments separately from other tools 'sortloot's attempt to group musical instruments separately from other tools
didn't work as intended due to missing 'break' in sortloot_classify() didn't work as intended due to missing 'break' in sortloot_classify()
<shift><letter> running told player about engravings as they were being moved
over but buffered output didn't show it until hero stopped, so it
wasn't possible to tell where they were, unlike all other forms of
multiple movement; stop running if/when an engraving is reached
Fixes to Post-3.6.2 Problems that Were Exposed Via git Repository Fixes to Post-3.6.2 Problems that Were Exposed Via git Repository

View File

@@ -114,16 +114,7 @@ E void FDECL(tty_startup, (int *, int *));
#ifndef NO_TERMS #ifndef NO_TERMS
E void NDECL(tty_shutdown); E void NDECL(tty_shutdown);
#endif #endif
#if defined(apollo) E int FDECL(xputc, (int));
/* Apollos don't widen old-style function definitions properly -- they try to
* be smart and use the prototype, or some such strangeness. So we have to
* define UNWIDENDED_PROTOTYPES (in tradstdc.h), which makes CHAR_P below a
* char. But the tputs termcap call was compiled as if xputc's argument
* actually would be expanded. So here, we have to make an exception. */
E void FDECL(xputc, (int));
#else
E void FDECL(xputc, (CHAR_P));
#endif
E void FDECL(xputs, (const char *)); E void FDECL(xputs, (const char *));
#if defined(SCREEN_VGA) || defined(SCREEN_8514) #if defined(SCREEN_VGA) || defined(SCREEN_8514)
E void FDECL(xputg, (int, int, unsigned)); E void FDECL(xputg, (int, int, unsigned));

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 engrave.c $NHDT-Date: 1456304550 2016/02/24 09:02:30 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.61 $ */ /* NetHack 3.6 engrave.c $NHDT-Date: 1570318925 2019/10/05 23:42:05 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.75 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2012. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -316,7 +316,6 @@ int x, y;
{ {
register struct engr *ep = engr_at(x, y); register struct engr *ep = engr_at(x, y);
int sensed = 0; int sensed = 0;
char buf[BUFSZ];
/* Sensing an engraving does not require sight, /* Sensing an engraving does not require sight,
* nor does it necessarily imply comprehension (literacy). * nor does it necessarily imply comprehension (literacy).
@@ -365,17 +364,22 @@ int x, y;
impossible("%s is written in a very strange way.", Something); impossible("%s is written in a very strange way.", Something);
sensed = 1; sensed = 1;
} }
if (sensed) { if (sensed) {
char *et; char *et, buf[BUFSZ];
unsigned maxelen = BUFSZ - sizeof("You feel the words: \"\". "); int maxelen = (int) (sizeof buf
if (strlen(ep->engr_txt) > maxelen) { /* sizeof "literal" counts terminating \0 */
(void) strncpy(buf, ep->engr_txt, (int) maxelen); - sizeof "You feel the words: \"\".");
if ((int) strlen(ep->engr_txt) > maxelen) {
(void) strncpy(buf, ep->engr_txt, maxelen);
buf[maxelen] = '\0'; buf[maxelen] = '\0';
et = buf; et = buf;
} else } else {
et = ep->engr_txt; et = ep->engr_txt;
}
You("%s: \"%s\".", (Blind) ? "feel the words" : "read", et); You("%s: \"%s\".", (Blind) ? "feel the words" : "read", et);
if (g.context.run > 1) if (g.context.run > 0)
nomul(0); nomul(0);
} }
} }

View File

@@ -571,8 +571,10 @@ const char *s;
} }
} }
void xputc(ch) /* write out character (and attribute) */ /* same signature as 'putchar()' with potential failure result ignored */
char ch; int
xputc(ch) /* write out character (and attribute) */
int ch;
{ {
int i; int i;
char attribute; char attribute;
@@ -591,16 +593,17 @@ char ch;
vesa_xputc(ch, attribute); vesa_xputc(ch, attribute);
#endif /*SCREEN_VESA*/ #endif /*SCREEN_VESA*/
} }
return 0;
} }
void xputg(glyphnum, ch, /* write out a glyph picture at current location */
special) /* write out a glyph picture at current location */ void xputg(glyphnum, ch, special)
int glyphnum; int glyphnum;
int ch; int ch;
unsigned special; unsigned special;
{ {
if (!iflags.grmode || !iflags.tile_view) { if (!iflags.grmode || !iflags.tile_view) {
xputc((char) ch); (void) xputc((char) ch);
#ifdef SCREEN_VGA #ifdef SCREEN_VGA
} else if (iflags.grmode && iflags.usevga) { } else if (iflags.grmode && iflags.usevga) {
vga_xputg(glyphnum, ch, special); vga_xputg(glyphnum, ch, special);

View File

@@ -27,7 +27,7 @@ int FDECL(tgetnum, (const char *));
char *FDECL(tgetstr, (const char *, char **)); char *FDECL(tgetstr, (const char *, char **));
char *FDECL(tgoto, (const char *, int, int)); char *FDECL(tgoto, (const char *, int, int));
char *FDECL(tparam, (const char *, char *, int, int, int, int, int)); char *FDECL(tparam, (const char *, char *, int, int, int, int, int));
void FDECL(tputs, (const char *, int, int (*)())); void FDECL(tputs, (const char *, int, int (*)(int)));
/* local support data */ /* local support data */
static char *tc_entry; static char *tc_entry;
@@ -502,9 +502,10 @@ int row, col, row2, col2;
/* send a string to the terminal, possibly padded with trailing NULs */ /* send a string to the terminal, possibly padded with trailing NULs */
void void
tputs(string, range, output_func) tputs(string, range, output_func)
const char *string; /* characters to output */ const char *string; /* characters to output */
int range; /* number of lines affected, used for `*' delays */ int range; /* number of lines affected, used for `*' delays */
int (*output_func)(); /* actual output routine; return value ignored */ int FDECL((*output_func),(int)); /* actual output routine;
* return value ignored */
{ {
register int c, num = 0; register int c, num = 0;
register const char *p = string; register const char *p = string;

View File

@@ -537,12 +537,14 @@ int x, y;
set_console_cursor(x, y); set_console_cursor(x, y);
} }
void /* same signature as 'putchar()' with potential failure result ignored */
int
xputc(ch) xputc(ch)
char ch; int ch;
{ {
set_console_cursor(ttyDisplay->curx, ttyDisplay->cury); set_console_cursor(ttyDisplay->curx, ttyDisplay->cury);
xputc_core(ch); xputc_core((char) ch);
return 0;
} }
void void
@@ -550,7 +552,7 @@ xputs(s)
const char *s; const char *s;
{ {
int k; int k;
int slen = strlen(s); int slen = (int) strlen(s);
if (ttyDisplay) if (ttyDisplay)
set_console_cursor(ttyDisplay->curx, ttyDisplay->cury); set_console_cursor(ttyDisplay->curx, ttyDisplay->cury);

View File

@@ -82,11 +82,11 @@ int mode;
return; return;
} }
void int
xputc(ch) xputc(ch)
char ch; int ch;
{ {
return; return 0;
} }
void void

View File

@@ -392,6 +392,7 @@ curses_ext_cmd()
extwin = newwin(1, w - 2, y0 + 1, x0 + 1); extwin = newwin(1, w - 2, y0 + 1, x0 + 1);
if (w - 4 < maxlen) if (w - 4 < maxlen)
maxlen = w - 4; maxlen = w - 4;
nhUse(h); /* needed only to give getmaxyx three arguments */
} else { } else {
curses_get_window_xy(MESSAGE_WIN, &winx, &winy); curses_get_window_xy(MESSAGE_WIN, &winx, &winy);
curses_get_window_size(MESSAGE_WIN, &messageh, &messagew); curses_get_window_size(MESSAGE_WIN, &messageh, &messagew);

View File

@@ -462,7 +462,7 @@ curses_choose_character()
tmpchoice[count] = toupper(tmpchoice[count]); tmpchoice[count] = toupper(tmpchoice[count]);
} }
sprintf(choice, "%s%s", choice, tmpchoice); strcat(choice, tmpchoice);
/* prevent an unnecessary prompt */ /* prevent an unnecessary prompt */
rigid_role_checks(); rigid_role_checks();

View File

@@ -202,7 +202,7 @@ curses_block(boolean noscroll) /* noscroll - blocking because of msgtype
prev_x = mx, prev_y = my; prev_x = mx, prev_y = my;
blink = 0; blink = 0;
} }
moreattr = !iflags.wc2_guicolor ? A_REVERSE : NONE; moreattr = !iflags.wc2_guicolor ? (int) A_REVERSE : NONE;
curses_toggle_color_attr(win, MORECOLOR, moreattr, ON); curses_toggle_color_attr(win, MORECOLOR, moreattr, ON);
if (blink) { if (blink) {
wattron(win, A_BLINK); wattron(win, A_BLINK);

View File

@@ -40,13 +40,18 @@ static int parse_escape_sequence(void);
int int
curses_read_char() curses_read_char()
{ {
int ch, tmpch; int ch;
#if defined(ALT_0) || defined(ALT_9) || defined(ALT_A) || defined(ALT_Z)
int tmpch;
#endif
/* cancel message suppression; all messages have had a chance to be read */ /* cancel message suppression; all messages have had a chance to be read */
curses_got_input(); curses_got_input();
ch = getch(); ch = getch();
#if defined(ALT_0) || defined(ALT_9) || defined(ALT_A) || defined(ALT_Z)
tmpch = ch; tmpch = ch;
#endif
ch = curses_convert_keys(ch); ch = curses_convert_keys(ch);
if (ch == 0) { if (ch == 0) {
@@ -372,7 +377,6 @@ curses_str_remainder(const char *str, int width, int line_num)
int strsize = strlen(str) + 1; int strsize = strlen(str) + 1;
#if __STDC_VERSION__ >= 199901L #if __STDC_VERSION__ >= 199901L
char substr[strsize]; char substr[strsize];
char curstr[strsize];
char tmpstr[strsize]; char tmpstr[strsize];
strcpy(substr, str); strcpy(substr, str);
@@ -381,7 +385,6 @@ curses_str_remainder(const char *str, int width, int line_num)
#define BUFSZ 256 #define BUFSZ 256
#endif #endif
char substr[BUFSZ * 2]; char substr[BUFSZ * 2];
char curstr[BUFSZ * 2];
char tmpstr[BUFSZ * 2]; char tmpstr[BUFSZ * 2];
if (strsize > (BUFSZ * 2) - 1) { if (strsize > (BUFSZ * 2) - 1) {
@@ -409,10 +412,6 @@ curses_str_remainder(const char *str, int width, int line_num)
if (last_space == 0) { /* No spaces found */ if (last_space == 0) { /* No spaces found */
last_space = count - 1; last_space = count - 1;
} }
for (count = 0; count < last_space; count++) {
curstr[count] = substr[count];
}
curstr[count] = '\0';
if (substr[count] == '\0') { if (substr[count] == '\0') {
break; break;
} }

View File

@@ -228,6 +228,7 @@ draw_status()
curs_reset_windows(TRUE, TRUE); curs_reset_windows(TRUE, TRUE);
win = curses_get_nhwin(STATUS_WIN); win = curses_get_nhwin(STATUS_WIN);
} }
nhUse(ax); /* getmaxyx macro isn't sufficient */
} }
werase(win); werase(win);
@@ -513,6 +514,7 @@ boolean border;
conditions would go if they were on this line */ conditions would go if they were on this line */
condstart += (cap_and_hunger == 2) ? spacing[BL_CAP] condstart += (cap_and_hunger == 2) ? spacing[BL_CAP]
: (cap_and_hunger == 0) ? 1 : 0; : (cap_and_hunger == 0) ? 1 : 0;
nhUse(conddummy); /* getyx needed 3 args */
} }
if (!(cap_and_hunger & 1)) if (!(cap_and_hunger & 1))
continue; continue;
@@ -533,6 +535,7 @@ boolean border;
t = (width - (border ? 0 : 1)) - (ex - 1); t = (width - (border ? 0 : 1)) - (ex - 1);
ebuf[max(t, 2)] = '\0'; /* might still wrap... */ ebuf[max(t, 2)] = '\0'; /* might still wrap... */
} }
nhUse(ey); /* getyx needed 3 args */
} }
break; break;
case BL_SCORE: case BL_SCORE:

View File

@@ -495,12 +495,10 @@ tty_end_screen()
/* Cursor movements */ /* Cursor movements */
/* Note to overlay tinkerers. The placement of this overlay controls the /* Note to overlay tinkerers. The placement of this overlay controls the
location location of the function xputc(). This function is not currently in
of the function xputc(). This function is not currently in trampoli.[ch] trampoli.[ch] files for what is deemed to be performance reasons. If
files for what is deemed to be performance reasons. If this define is this define is moved and or xputc() is taken out of the ROOT overlay,
moved then action must be taken in trampoli.[ch]. */
and or xputc() is taken out of the ROOT overlay, then action must be taken
in trampoli.[ch]. */
void void
nocmov(x, y) nocmov(x, y)
@@ -528,7 +526,7 @@ int x, y;
cmov(x, y); cmov(x, y);
} else { } else {
while ((int) ttyDisplay->cury < y) { while ((int) ttyDisplay->cury < y) {
xputc('\n'); (void) xputc('\n');
ttyDisplay->curx = 0; ttyDisplay->curx = 0;
ttyDisplay->cury++; ttyDisplay->cury++;
} }
@@ -561,16 +559,27 @@ register int x, y;
ttyDisplay->curx = x; ttyDisplay->curx = x;
} }
/* See note above. xputc() is a special function. */ /* See note above. xputc() is a special function for overlays. */
void int
xputc(c) xputc(c)
#if defined(apollo) int c; /* actually char, but explicitly specify its widened type */
int c;
#else
char c;
#endif
{ {
(void) putchar(c); /*
* Note: xputc() as a direct all to putchar() doesn't make any
* sense _if_ putchar() is a function. But if it is a macro, an
* overlay configuration would want to avoid hidden code bloat
* from multiple putchar() expansions. And it gets passed as an
* argument to tputs() so we have to guarantee an actual function
* (while possibly lacking ANSI's (func) syntax to override macro).
*
* xputc() used to be declared as 'void xputc(c) char c; {}' but
* avoiding the proper type 'int' just to avoid (void) casts when
* ignoring the result can't have been sufficent reason to add it.
* It also had '#if apollo' conditional to have the arg be int.
* Matching putchar()'s declaration and using explicit casts where
* warranted is more robust, so we're just a jacket around that.
*/
return putchar(c);
} }
void void
@@ -579,13 +588,9 @@ const char *s;
{ {
#ifndef TERMLIB #ifndef TERMLIB
(void) fputs(s, stdout); (void) fputs(s, stdout);
#else
#if defined(NHSTDC) || defined(ULTRIX_PROTO)
tputs(s, 1, (int (*) ()) xputc);
#else #else
tputs(s, 1, xputc); tputs(s, 1, xputc);
#endif #endif
#endif
} }
void void
@@ -599,7 +604,7 @@ cl_end()
/* this looks terrible, especially on a slow terminal /* this looks terrible, especially on a slow terminal
but is better than nothing */ but is better than nothing */
while (cx < CO) { while (cx < CO) {
xputc(' '); (void) xputc(' ');
cx++; cx++;
} }
tty_curs(BASE_WINDOW, (int) ttyDisplay->curx + 1, tty_curs(BASE_WINDOW, (int) ttyDisplay->curx + 1,
@@ -754,25 +759,18 @@ tty_delay_output()
/* BUG: if the padding character is visible, as it is on the 5620 /* BUG: if the padding character is visible, as it is on the 5620
then this looks terrible. */ then this looks terrible. */
if (flags.null) { if (flags.null) {
tputs(
#ifdef TERMINFO #ifdef TERMINFO
/* cbosgd!cbcephus!pds for SYS V R2 */ "$<50>",
#ifdef NHSTDC
tputs("$<50>", 1, (int (*) ()) xputc);
#else #else
tputs("$<50>", 1, xputc); "50",
#endif
#else
#if defined(NHSTDC) || defined(ULTRIX_PROTO)
tputs("50", 1, (int (*) ()) xputc);
#else
tputs("50", 1, xputc);
#endif
#endif #endif
1, xputc);
} else if (ospeed > 0 && ospeed < SIZE(tmspc10) && nh_CM) { } else if (ospeed > 0 && ospeed < SIZE(tmspc10) && nh_CM) {
/* delay by sending cm(here) an appropriate number of times */ /* delay by sending cm(here) an appropriate number of times */
register int cmlen = register int cmlen =
strlen(tgoto(nh_CM, ttyDisplay->curx, ttyDisplay->cury)); (int) strlen(tgoto(nh_CM, ttyDisplay->curx, ttyDisplay->cury));
register int i = 500 + tmspc10[ospeed] / 2; register int i = 500 + tmspc10[ospeed] / 2;
while (i > 0) { while (i > 0) {
@@ -794,7 +792,7 @@ cl_eos() /* free after Robert Viduya */
while (cy <= LI - 2) { while (cy <= LI - 2) {
cl_end(); cl_end();
xputc('\n'); (void) xputc('\n');
cy++; cy++;
} }
cl_end(); cl_end();

View File

@@ -204,7 +204,7 @@ static boolean FDECL(check_fields, (BOOLEAN_P, int *));
static void NDECL(render_status); static void NDECL(render_status);
static void FDECL(tty_putstatusfield, (const char *, int, int)); static void FDECL(tty_putstatusfield, (const char *, int, int));
static boolean NDECL(check_windowdata); static boolean NDECL(check_windowdata);
static int NDECL(condition_size); static void NDECL(set_condition_length);
static int FDECL(make_things_fit, (BOOLEAN_P)); static int FDECL(make_things_fit, (BOOLEAN_P));
static void FDECL(shrink_enc, (int)); static void FDECL(shrink_enc, (int));
static void FDECL(shrink_dlvl, (int)); static void FDECL(shrink_dlvl, (int));
@@ -3613,7 +3613,7 @@ char *posbar;
* and tries a few different ways to squish a representation * and tries a few different ways to squish a representation
* of the status window values onto the 80 column tty display. * of the status window values onto the 80 column tty display.
* ->check_fields() * ->check_fields()
* ->condition_size() - get the width of all conditions * ->set_condition_length() - update the width of conditions
* ->shrink_enc() - shrink encumbrance message word * ->shrink_enc() - shrink encumbrance message word
* ->shrink_dlvl() - reduce the width of Dlvl:42 * ->shrink_dlvl() - reduce the width of Dlvl:42
* *
@@ -3967,7 +3967,7 @@ static int
make_things_fit(force_update) make_things_fit(force_update)
boolean force_update; boolean force_update;
{ {
int trycnt, fitting = 0, condsz, requirement; int trycnt, fitting = 0, requirement;
int rowsz[3], num_rows, condrow, otheroptions = 0; int rowsz[3], num_rows, condrow, otheroptions = 0;
num_rows = (iflags.wc2_statuslines < 3) ? 2 : 3; num_rows = (iflags.wc2_statuslines < 3) ? 2 : 3;
@@ -3977,7 +3977,7 @@ boolean force_update;
shrink_enc(0); shrink_enc(0);
if (dlvl_shrinklvl > 0) if (dlvl_shrinklvl > 0)
shrink_dlvl(0); shrink_dlvl(0);
condsz = condition_size(); set_condition_length();
for (trycnt = 0; trycnt < 6 && !fitting; ++trycnt) { for (trycnt = 0; trycnt < 6 && !fitting; ++trycnt) {
/* FIXME: this remeasures each line every time even though it /* FIXME: this remeasures each line every time even though it
is only attempting to shrink one of them and the other one is only attempting to shrink one of them and the other one
@@ -3995,7 +3995,7 @@ boolean force_update;
if (trycnt < 2) { if (trycnt < 2) {
if (cond_shrinklvl < trycnt + 1) { if (cond_shrinklvl < trycnt + 1) {
cond_shrinklvl = trycnt + 1; cond_shrinklvl = trycnt + 1;
condsz = condition_size(); set_condition_length();
} }
continue; continue;
} }
@@ -4217,13 +4217,12 @@ int x, y;
} }
/* caller must set cond_shrinklvl (0..2) before calling us */ /* caller must set cond_shrinklvl (0..2) before calling us */
static int static void
condition_size() set_condition_length()
{ {
long mask; long mask;
int c, lth; int c, lth = 0;
lth = 0;
if (tty_condition_bits) { if (tty_condition_bits) {
for (c = 0; c < SIZE(conditions); ++c) { for (c = 0; c < SIZE(conditions); ++c) {
mask = conditions[c].mask; mask = conditions[c].mask;
@@ -4232,7 +4231,6 @@ condition_size()
} }
} }
tty_status[NOW][BL_CONDITION].lth = lth; tty_status[NOW][BL_CONDITION].lth = lth;
return lth;
} }
static void static void