get_hilite_color()

Stop pretending that long and int are the same size when picking status
highlight rule for gold or time or experience-points.

Also, K&R compilation might lack <limits.h>, so let XXXconf.h define the
necessary macro(s) (currently just LONG_MAX) so that it can be skipped.
This commit is contained in:
PatR
2018-12-15 15:46:49 -08:00
parent 7d15535923
commit 27a515a4cc
4 changed files with 97 additions and 50 deletions
+2
View File
@@ -297,6 +297,8 @@ fix bit-use collision between WC2_TERM_SIZE and WC2_RESET_STATUS in
include/winprocs.h following a recent merge include/winprocs.h following a recent merge
fix foxen pluralization again after underflow remedy reintroduced the problem fix foxen pluralization again after underflow remedy reintroduced the problem
fix "placing monster over another?" warning for vault guards fix "placing monster over another?" warning for vault guards
status highlighting classified gold, time, and experience-points as data type
'long' but when selecting hilite rule to use treated them as 'int'
tty: turn off an optimization that is the suspected cause of Windows reported tty: turn off an optimization that is the suspected cause of Windows reported
partial status lines following level changes partial status lines following level changes
tty: ensure that current status fields are always copied to prior status tty: ensure that current status fields are always copied to prior status
+89 -48
View File
@@ -1,10 +1,12 @@
/* NetHack 3.6 botl.c $NHDT-Date: 1544229439 2018/12/08 00:37:19 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.129 $ */ /* NetHack 3.6 botl.c $NHDT-Date: 1544917592 2018/12/15 23:46:32 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.131 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Michael Allison, 2006. */ /*-Copyright (c) Michael Allison, 2006. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
#include "hack.h" #include "hack.h"
#ifndef LONG_MAX
#include <limits.h> #include <limits.h>
#endif
extern const char *hu_stat[]; /* defined in eat.c */ extern const char *hu_stat[]; /* defined in eat.c */
@@ -1394,13 +1396,10 @@ int newcolor;
/* /*
* get_hilite_color * get_hilite_color
* *
* Figures out, based on the value and the * Figures out, based on the value and the direction it is moving,
* direction it is moving, the color that the field * the color that the field should be displayed in.
* should be displayed in.
* *
* * Provide get_hilite_color() with the following to work with:
* Provide get_hilite_color() with the following
* to work with:
* actual value vp * actual value vp
* useful for BL_TH_VAL_ABSOLUTE * useful for BL_TH_VAL_ABSOLUTE
* indicator of down, up, or the same (-1, 1, 0) chg * indicator of down, up, or the same (-1, 1, 0) chg
@@ -1416,7 +1415,6 @@ int newcolor;
* color = 0x00FF * color = 0x00FF
* attrib= 0xFF00 * attrib= 0xFF00
*/ */
STATIC_OVL void STATIC_OVL void
get_hilite_color(idx, fldidx, vp, chg, pc, colorptr) get_hilite_color(idx, fldidx, vp, chg, pc, colorptr)
int idx, fldidx, chg, pc; int idx, fldidx, chg, pc;
@@ -1432,14 +1430,21 @@ int *colorptr;
return; return;
if (blstats[idx][fldidx].thresholds) { if (blstats[idx][fldidx].thresholds) {
int dt;
/* there are hilites set here */ /* there are hilites set here */
int max_pc = -1, min_pc = 101; int max_pc = -1, min_pc = 101;
int max_val = -LARGEST_INT, min_val = LARGEST_INT; /* LARGEST_INT isn't INT_MAX; it fits within 16 bits, but that
value is big enough to handle all 'int' status fields */
int max_ival = -LARGEST_INT, min_ival = LARGEST_INT;
/* LONG_MAX comes from <limits.h> which might not be available for
ancient configurations; we don't need LONG_MIN */
long max_lval = -LONG_MAX, min_lval = LONG_MAX;
boolean exactmatch = FALSE, updown = FALSE, changed = FALSE, boolean exactmatch = FALSE, updown = FALSE, changed = FALSE,
perc_or_abs = FALSE; perc_or_abs = FALSE;
/* min_/max_ are used to track best fit */ /* min_/max_ are used to track best fit */
for (hl = blstats[idx][fldidx].thresholds; hl; hl = hl->next) { for (hl = blstats[idx][fldidx].thresholds; hl; hl = hl->next) {
dt = initblstats[fldidx].anytype; /* only needed for 'absolute' */
/* if we've already matched a temporary highlight, it takes /* if we've already matched a temporary highlight, it takes
precedence over all persistent ones; we still process precedence over all persistent ones; we still process
updown rules to get the last one which qualifies */ updown rules to get the last one which qualifies */
@@ -1451,7 +1456,7 @@ int *colorptr;
continue; continue;
switch (hl->behavior) { switch (hl->behavior) {
case BL_TH_VAL_PERCENTAGE: case BL_TH_VAL_PERCENTAGE: /* percent values are always ANY_INT */
if (hl->rel == EQ_VALUE && pc == hl->value.a_int) { if (hl->rel == EQ_VALUE && pc == hl->value.a_int) {
merge_bestcolor(&bestcolor, hl->coloridx); merge_bestcolor(&bestcolor, hl->coloridx);
min_pc = max_pc = hl->value.a_int; min_pc = max_pc = hl->value.a_int;
@@ -1484,7 +1489,7 @@ int *colorptr;
perc_or_abs = TRUE; perc_or_abs = TRUE;
} }
break; break;
case BL_TH_UPDOWN: case BL_TH_UPDOWN: /* uses 'chg' (set by caller), not 'dt' */
/* specific 'up' or 'down' takes precedence over general /* specific 'up' or 'down' takes precedence over general
'changed' regardless of their order in the rule set */ 'changed' regardless of their order in the rule set */
if (chg < 0 && hl->rel == LT_VALUE) { if (chg < 0 && hl->rel == LT_VALUE) {
@@ -1498,45 +1503,81 @@ int *colorptr;
changed = TRUE; changed = TRUE;
} }
break; break;
case BL_TH_VAL_ABSOLUTE: case BL_TH_VAL_ABSOLUTE: /* either ANY_INT or ANY_LONG */
/* /*
* TODO: * The int and long variations here are identical aside from
* This covers data type ANY_INT. We need to handle ANY_LONG * union field and min_/max_ variable names. If you change
* separately using a_long and new min_lval, max_lval. * one, be sure to make a corresponding change in the other.
*/ */
if (hl->rel == EQ_VALUE && hl->value.a_int == value->a_int) { if (dt == ANY_INT) {
merge_bestcolor(&bestcolor, hl->coloridx); if (hl->rel == EQ_VALUE
min_val = max_val = hl->value.a_int; && hl->value.a_int == value->a_int) {
exactmatch = perc_or_abs = TRUE; merge_bestcolor(&bestcolor, hl->coloridx);
} else if (exactmatch) { min_ival = max_ival = hl->value.a_int;
; /* already found best fit, skip lt,ge,&c */ exactmatch = perc_or_abs = TRUE;
} else if (hl->rel == LT_VALUE } else if (exactmatch) {
&& (value->a_int < hl->value.a_int) ; /* already found best fit, skip lt,ge,&c */
&& (hl->value.a_int <= min_val)) { } else if (hl->rel == LT_VALUE
merge_bestcolor(&bestcolor, hl->coloridx); && (value->a_int < hl->value.a_int)
min_val = hl->value.a_int; && (hl->value.a_int <= min_ival)) {
perc_or_abs = TRUE; merge_bestcolor(&bestcolor, hl->coloridx);
} else if (hl->rel == LE_VALUE min_ival = hl->value.a_int;
&& (value->a_int <= hl->value.a_int) perc_or_abs = TRUE;
&& (hl->value.a_int <= min_val)) { } else if (hl->rel == LE_VALUE
merge_bestcolor(&bestcolor, hl->coloridx); && (value->a_int <= hl->value.a_int)
min_val = hl->value.a_int; && (hl->value.a_int <= min_ival)) {
perc_or_abs = TRUE; merge_bestcolor(&bestcolor, hl->coloridx);
} else if (hl->rel == GT_VALUE min_ival = hl->value.a_int;
&& (value->a_int > hl->value.a_int) perc_or_abs = TRUE;
&& (hl->value.a_int >= max_val)) { } else if (hl->rel == GT_VALUE
merge_bestcolor(&bestcolor, hl->coloridx); && (value->a_int > hl->value.a_int)
max_val = hl->value.a_int; && (hl->value.a_int >= max_ival)) {
perc_or_abs = TRUE; merge_bestcolor(&bestcolor, hl->coloridx);
} else if (hl->rel == GE_VALUE max_ival = hl->value.a_int;
&& (value->a_int >= hl->value.a_int) perc_or_abs = TRUE;
&& (hl->value.a_int >= max_val)) { } else if (hl->rel == GE_VALUE
merge_bestcolor(&bestcolor, hl->coloridx); && (value->a_int >= hl->value.a_int)
max_val = hl->value.a_int; && (hl->value.a_int >= max_ival)) {
perc_or_abs = TRUE; merge_bestcolor(&bestcolor, hl->coloridx);
max_ival = hl->value.a_int;
perc_or_abs = TRUE;
}
} else { /* ANY_LONG */
if (hl->rel == EQ_VALUE
&& hl->value.a_long == value->a_long) {
merge_bestcolor(&bestcolor, hl->coloridx);
min_lval = max_lval = hl->value.a_long;
exactmatch = perc_or_abs = TRUE;
} else if (exactmatch) {
; /* already found best fit, skip lt,ge,&c */
} else if (hl->rel == LT_VALUE
&& (value->a_long < hl->value.a_long)
&& (hl->value.a_long <= min_lval)) {
merge_bestcolor(&bestcolor, hl->coloridx);
min_lval = hl->value.a_long;
perc_or_abs = TRUE;
} else if (hl->rel == LE_VALUE
&& (value->a_long <= hl->value.a_long)
&& (hl->value.a_long <= min_lval)) {
merge_bestcolor(&bestcolor, hl->coloridx);
min_lval = hl->value.a_long;
perc_or_abs = TRUE;
} else if (hl->rel == GT_VALUE
&& (value->a_long > hl->value.a_long)
&& (hl->value.a_long >= max_lval)) {
merge_bestcolor(&bestcolor, hl->coloridx);
max_lval = hl->value.a_long;
perc_or_abs = TRUE;
} else if (hl->rel == GE_VALUE
&& (value->a_long >= hl->value.a_long)
&& (hl->value.a_long >= max_lval)) {
merge_bestcolor(&bestcolor, hl->coloridx);
max_lval = hl->value.a_long;
perc_or_abs = TRUE;
}
} }
break; break;
case BL_TH_TEXTMATCH: case BL_TH_TEXTMATCH: /* ANY_STR */
txtstr = blstats[idx][fldidx].val; txtstr = blstats[idx][fldidx].val;
if (fldidx == BL_TITLE) if (fldidx == BL_TITLE)
/* "<name> the <rank-title>", skip past "<name> the " */ /* "<name> the <rank-title>", skip past "<name> the " */
+3 -1
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 end.c $NHDT-Date: 1544666123 2018/12/13 01:55:23 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.157 $ */ /* NetHack 3.6 end.c $NHDT-Date: 1544917598 2018/12/15 23:46:38 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.158 $ */
/* 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. */
@@ -11,7 +11,9 @@
#include <signal.h> #include <signal.h>
#endif #endif
#include <ctype.h> #include <ctype.h>
#ifndef LONG_MAX
#include <limits.h> #include <limits.h>
#endif
#include "dlb.h" #include "dlb.h"
/* add b to long a, convert wraparound to max value */ /* add b to long a, convert wraparound to max value */
+3 -1
View File
@@ -1,10 +1,12 @@
/* NetHack 3.6 exper.c $NHDT-Date: 1541145516 2018/11/02 07:58:36 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.30 $ */ /* NetHack 3.6 exper.c $NHDT-Date: 1544917599 2018/12/15 23:46:39 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.31 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2007. */ /*-Copyright (c) Robert Patrick Rankin, 2007. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
#include "hack.h" #include "hack.h"
#ifndef LONG_MAX
#include <limits.h> #include <limits.h>
#endif
STATIC_DCL int FDECL(enermod, (int)); STATIC_DCL int FDECL(enermod, (int));