Merge branch 'NetHack-3.6.2-beta01' into NetHack-3.6.2

This commit is contained in:
nhmall
2019-03-26 17:49:09 -04:00
2 changed files with 45 additions and 19 deletions

View File

@@ -24,7 +24,7 @@ typedef struct nhpm {
static void scroll_window(winid wid);
static void unscroll_window(winid wid);
static void directional_scroll(winid wid, int nlines);
static void mesg_add_line(char *mline);
static void mesg_add_line(const char *mline);
static nhprev_mesg *get_msg_line(boolean reverse, int mindex);
static int turn_lines = 1;
@@ -95,7 +95,7 @@ curses_message_win_puts(const char *message, boolean recursed)
if (!recursed) {
strcpy(toplines, message);
mesg_add_line((char *) message);
mesg_add_line(message);
}
if (linespace < message_length) {
@@ -398,7 +398,7 @@ curses_message_win_getline(const char *prompt, char *answer, int buffer)
Strcat(tmpbuf, " ");
nlines = curses_num_lines(tmpbuf,width);
maxlines += nlines * 2;
linestarts = (char **) alloc((unsigned) (sizeof (char *) * maxlines));
linestarts = (char **) alloc((unsigned) (maxlines * sizeof (char *)));
p_answer = tmpbuf + strlen(tmpbuf);
linestarts[0] = tmpbuf;
@@ -515,7 +515,7 @@ curses_message_win_getline(const char *prompt, char *answer, int buffer)
(void) strncpy(answer, p_answer, buffer);
answer[buffer - 1] = '\0';
Strcpy(toplines, tmpbuf);
mesg_add_line((char *) tmpbuf);
mesg_add_line(tmpbuf);
free(tmpbuf);
curs_set(orig_cursor);
curses_toggle_color_attr(win, NONE, A_BOLD, OFF);
@@ -615,34 +615,55 @@ directional_scroll(winid wid, int nlines)
/* Add given line to message history */
static void
mesg_add_line(char *mline)
mesg_add_line(const char *mline)
{
nhprev_mesg *tmp_mesg = NULL;
nhprev_mesg *current_mesg = (nhprev_mesg *) alloc((unsigned)
(sizeof (nhprev_mesg)));
nhprev_mesg *current_mesg;
current_mesg->str = curses_copy_of(mline);
/*
* Messages are kept in a doubly linked list, with head 'first_mesg',
* tail 'last_mesg', and a maximum capacity of 'max_messages'.
*/
if (num_messages < max_messages) {
/* create a new list element */
current_mesg = (nhprev_mesg *) alloc((unsigned) sizeof (nhprev_mesg));
current_mesg->str = dupstr(mline);
} else {
/* instead of discarding list element being forced out, reuse it */
current_mesg = first_mesg;
/* whenever new 'mline' is shorter, extra allocation size of the
original element will be frittered away, until eventually we'll
discard this 'str' and dupstr() a replacement; we could easily
track the allocation size but don't really need to do so */
if (strlen(mline) <= strlen(current_mesg->str)) {
Strcpy(current_mesg->str, mline);
} else {
free((genericptr_t) current_mesg->str);
current_mesg->str = dupstr(mline);
}
}
current_mesg->turn = moves;
current_mesg->next_mesg = NULL;
if (num_messages == 0) {
/* very first message; set up head */
first_mesg = current_mesg;
}
if (last_mesg != NULL) {
} else {
/* not first message; tail exists */
last_mesg->next_mesg = current_mesg;
}
current_mesg->prev_mesg = last_mesg;
last_mesg = current_mesg;
last_mesg = current_mesg; /* new tail */
if (num_messages < max_messages) {
num_messages++;
/* wasn't at capacity yet */
++num_messages;
} else {
tmp_mesg = first_mesg->next_mesg;
free(first_mesg->str);
free(first_mesg);
first_mesg = tmp_mesg;
/* at capacity; old head is being removed */
first_mesg = first_mesg->next_mesg; /* new head */
first_mesg->prev_mesg = NULL; /* head has no prev_mesg */
}
/* since 'current_mesg' might be reusing 'first_mesg' and has now
become 'last_mesg', this update must be after head replacement */
last_mesg->next_mesg = NULL; /* tail has no next_mesg */
}

View File

@@ -370,6 +370,11 @@ unsigned long *colormasks;
w = xtra = 0; /* w: width so far; xtra: number of extra spaces */
prev_fld = BL_FLUSH;
for (i = 0; (fld = (*fieldorder)[j][i]) != BL_FLUSH; ++i) {
/* when the core marks a field as disabled, it doesn't call
status_update() to tell us to throw away the old value, so
polymorph leaves stale XP and rehumanize leaves stale HD */
if (!status_activefields[fld])
*status_vals[fld] = '\0';
text = status_vals[fld];
if (i == 0 && *text == ' ')
++text;