Merge branch 'NetHack:NetHack-3.7' into NetHack-3.7

This commit is contained in:
RainRat
2024-04-11 18:29:38 -07:00
committed by GitHub
6 changed files with 60 additions and 26 deletions

View File

@@ -27,7 +27,7 @@ static char *status_vals_long[MAXBLSTATS];
static unsigned long *curses_colormasks;
static long curses_condition_bits;
static int curses_status_colors[MAXBLSTATS];
static int hpbar_percent, hpbar_color;
static int hpbar_percent, hpbar_crit_hp, hpbar_color;
static int vert_status_dirty;
static void draw_status(void);
@@ -57,7 +57,7 @@ curses_status_init(void)
*status_vals_long[i] = '\0';
}
curses_condition_bits = 0L;
hpbar_percent = 0, hpbar_color = NO_COLOR;
hpbar_percent = hpbar_crit_hp = 0, hpbar_color = NO_COLOR;
vert_status_dirty = 1;
/* let genl_status_init do most of the initialization */
@@ -180,8 +180,8 @@ curses_status_update(
} else {
Sprintf(status_vals[fldidx],
(fldidx == BL_TITLE && iflags.wc2_hitpointbar)
? "%-30s" : status_fieldfmt[fldidx]
? status_fieldfmt[fldidx] : "%s",
? "%-30.30s" : status_fieldfmt[fldidx]
? status_fieldfmt[fldidx] : "%s",
text);
/* strip trailing spaces; core ought to do this for us */
if (fldidx == BL_HUNGER || fldidx == BL_LEVELDESC)
@@ -195,7 +195,9 @@ curses_status_update(
curses_status_colors[fldidx] = color_and_attr;
if (iflags.wc2_hitpointbar && fldidx == BL_HP) {
hpbar_percent = percent;
hpbar_color = color_and_attr;
hpbar_crit_hp = critically_low_hp(TRUE) ? 1 : 0;
hpbar_color = ((color_and_attr & 0x00ff) | (HL_INVERSE << 8)
| (hpbar_crit_hp ? (HL_BLINK << 8) : 0));
}
}
} else { /* BL_FLUSH */
@@ -950,8 +952,9 @@ draw_vertical(boolean border)
/* hitpointbar using hp percent calculation */
static void
curs_HPbar(char *text, /* pre-padded with trailing spaces if short */
int bar_len) /* width of space within the brackets */
curs_HPbar(
char *text, /* pre-padded with trailing spaces if short */
int bar_len) /* width of space within the brackets */
{
#ifdef STATUS_HILITES
int coloridx = 0;
@@ -967,6 +970,8 @@ curs_HPbar(char *text, /* pre-padded with trailing spaces if short */
bar_len = k;
(void) strncpy(bar, text, bar_len);
bar[bar_len] = '\0';
if (hpbar_crit_hp)
repad_with_dashes(bar);
bar_pos = (bar_len * hpbar_percent) / 100;
if (bar_pos < 1 && hpbar_percent > 0)
@@ -980,6 +985,8 @@ curs_HPbar(char *text, /* pre-padded with trailing spaces if short */
}
waddch(win, '[');
if (hpbar_crit_hp)
wattron(win, A_BLINK);
if (*bar) { /* True unless dead (0 HP => bar_pos == 0) */
/* fixed attribute, not nhattr2curses((hpbar_color >> 8) & 0x00FF) */
wattron(win, A_REVERSE); /* do this even if hilite_delta is 0 */
@@ -1008,6 +1015,8 @@ curs_HPbar(char *text, /* pre-padded with trailing spaces if short */
*bar2 = savedch;
waddstr(win, bar2);
}
if (hpbar_crit_hp)
wattroff(win, A_BLINK);
waddch(win, ']');
}

View File

@@ -4200,7 +4200,7 @@ static int condattr(long, unsigned long *);
static unsigned long *tty_colormasks;
static long tty_condition_bits;
static struct tty_status_fields tty_status[2][MAXBLSTATS]; /* 2: NOW,BEFORE */
static int hpbar_percent, hpbar_color;
static int hpbar_percent, hpbar_crit_hp;
extern const struct conditions_t conditions[CONDITION_COUNT];
static const char *const encvals[3][6] = {
@@ -4288,7 +4288,7 @@ tty_status_init(void)
tty_status[BEFORE][i] = tty_status[NOW][i];
}
tty_condition_bits = 0L;
hpbar_percent = 0, hpbar_color = NO_COLOR;
hpbar_percent = hpbar_crit_hp = 0;
#endif /* STATUS_HILITES */
/* let genl_status_init do most of the initialization */
@@ -4468,8 +4468,10 @@ tty_status_update(
if (iflags.wc2_hitpointbar) {
/* Special additional processing for hitpointbar */
hpbar_percent = percent;
hpbar_color = (color & 0x00FF);
tty_status[NOW][BL_TITLE].color = hpbar_color;
hpbar_crit_hp = critically_low_hp(TRUE) ? 1 : 0;
tty_status[NOW][BL_TITLE].color = (color & 0x00FF);
attrmask = HL_INVERSE | (hpbar_crit_hp ? HL_BLINK : 0);
tty_status[NOW][BL_TITLE].attr = term_attr_fixup(attrmask);
tty_status[NOW][BL_TITLE].dirty = TRUE;
}
break;
@@ -5050,7 +5052,7 @@ render_status(void)
*/
/* hitpointbar using hp percent calculation */
int bar_len, bar_pos = 0;
char bar[MAXCO], *bar2 = (char *) 0, savedch = '\0';
char bar[30 + 1], *bar2 = (char *) 0, savedch = '\0';
boolean twoparts = (hpbar_percent < 100);
/* force exactly 30 characters, padded with spaces
@@ -5058,10 +5060,14 @@ render_status(void)
if (strlen(text) != 30) {
Sprintf(bar, "%-30.30s", text);
Strcpy(status_vals[BL_TITLE], bar);
} else
} else {
Strcpy(bar, text);
}
if (hpbar_crit_hp)
repad_with_dashes(bar);
bar_len = (int) strlen(bar); /* always 30 */
tlth = bar_len + 2;
attrmask = 0; /* for the second part only case: dead */
/* when at full HP, the whole title will be highlighted;
when injured or dead, there will be a second portion
which is not highlighted */
@@ -5078,19 +5084,25 @@ render_status(void)
}
tty_putstatusfield("[", x++, y);
if (*bar) { /* always True, unless twoparts+dead (0 HP) */
term_start_attr(ATR_INVERSE);
if (iflags.hilite_delta && hpbar_color != NO_COLOR)
term_start_color(hpbar_color);
coloridx = tty_status[NOW][BL_TITLE].color;
attrmask = tty_status[NOW][BL_TITLE].attr;
Begin_Attr(attrmask);
if (iflags.hilite_delta && coloridx != NO_COLOR)
term_start_color(coloridx);
tty_putstatusfield(bar, x, y);
x += (int) strlen(bar);
if (iflags.hilite_delta && hpbar_color != NO_COLOR)
if (iflags.hilite_delta && coloridx != NO_COLOR)
term_end_color();
term_end_attr(ATR_INVERSE);
End_Attr(attrmask);
}
if (twoparts) { /* no highlighting for second part */
if (twoparts) {
if ((attrmask & HL_BLINK) != 0)
term_start_attr(ATR_BLINK);
*bar2 = savedch;
tty_putstatusfield(bar2, x, y);
x += (int) strlen(bar2);
if ((attrmask & HL_BLINK) != 0)
term_end_attr(ATR_BLINK);
}
tty_putstatusfield("]", x++, y);
} else {