some updates

Changes to be committed:
	modified:   include/botl.h
	modified:   src/botl.c
This commit is contained in:
nhmall
2015-05-30 22:22:39 -04:00
parent 54cee6913e
commit 4ccbf2edc8
2 changed files with 253 additions and 95 deletions

View File

@@ -6,9 +6,9 @@
#define BOTL_H
#ifdef STATUS_VIA_WINDOWPORT
#if 0
/* clang-format off */
#define BL_FLUSH -1
#define BL_BOGUS -1
#define BL_TITLE 0
#define BL_STR 1
#define BL_DX 2
@@ -32,8 +32,18 @@
#define BL_LEVELDESC 20
#define BL_EXP 21
#define BL_CONDITION 22
#define MAXBLSTATS 23
/* clang-format on */
#else
enum statusfields { BL_BOGUS = -1, BL_TITLE = 0, BL_STR, BL_DX, BL_CO, BL_IN,
BL_WI, BL_CH, BL_ALIGN, BL_SCORE, BL_CAP, BL_GOLD, BL_ENE, BL_ENEMAX,
BL_XP, BL_AC, BL_HD, BL_TIME, BL_HUNGER, BL_HP, BL_HPMAX, BL_LEVELDESC,
BL_EXP, BL_CONDITION };
#define BL_FLUSH BL_BOGUS
#define MAXBLSTATS BL_CONDITION+1
#define BEFORE 0
#define NOW 1
#endif
/* Boolean condition bits for the condition mask */

View File

@@ -18,8 +18,70 @@ struct istat_s {
char *val;
int valwidth;
int idxmax;
enum statusfields fld;
};
/* If entries are added to this, botl.h will require updating too */
struct istat_s initblstats[MAXBLSTATS] = {
{ 0L, ANY_STR, {(genericptr_t)0L}, (char *)0, 80, 0, BL_TITLE},
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0, BL_STR},
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0, BL_DX},
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0, BL_CO},
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0, BL_IN},
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0, BL_WI},
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0, BL_CH},
{ 0L, ANY_STR, {(genericptr_t)0L}, (char *)0, 40, 0, BL_ALIGN},
{ 0L, ANY_LONG, {(genericptr_t)0L}, (char *)0, 20, 0, BL_SCORE},
{ 0L, ANY_LONG, {(genericptr_t)0L}, (char *)0, 20, 0, BL_CAP},
{ 0L, ANY_LONG, {(genericptr_t)0L}, (char *)0, 30, 0, BL_GOLD},
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0, BL_ENE},
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0, BL_ENEMAX},
{ 0L, ANY_LONG, {(genericptr_t)0L}, (char *)0, 10, 0, BL_XP},
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0, BL_AC},
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0, BL_HD},
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 20, 0, BL_TIME},
{ 0L, ANY_UINT, {(genericptr_t)0L}, (char *)0, 40, 0, BL_HUNGER},
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0, BL_HP},
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0, BL_HPMAX},
{ 0L, ANY_STR, {(genericptr_t)0L}, (char *)0, 80, 0, BL_LEVELDESC},
{ 0L, ANY_LONG, {(genericptr_t)0L}, (char *)0, 20, 0, BL_EXP},
{ 0L, ANY_MASK32,{(genericptr_t)0L},(char *)0, 0, 0, BL_CONDITION}
};
static struct fieldid_t {
const char *fieldname;
enum statusfields fldid;
} fieldids[] = {
{"title", BL_TITLE},
{"strength", BL_STR},
{"dexterity", BL_DX},
{"constitution", BL_CO},
{"intelligence", BL_IN},
{"wisdom", BL_WI},
{"charisma", BL_CH},
{"alignment", BL_ALIGN},
{"score", BL_SCORE},
{"carrying-capacity", BL_CAP},
{"gold", BL_GOLD},
{"power", BL_ENE},
{"power-max", BL_ENEMAX},
{"experience-level", BL_XP},
{"armor-class", BL_AC},
{"HD", BL_HD},
{"time", BL_TIME},
{"hunger", BL_HUNGER},
{"hitpoints", BL_HP},
{"hitpoints-max", BL_HPMAX},
{"dungeon-level", BL_LEVELDESC},
{"experience", BL_EXP},
{"condition", BL_CONDITION},
};
struct istat_s blstats[2][MAXBLSTATS];
static boolean blinit = FALSE, update_all = FALSE;
STATIC_DCL void NDECL(init_blstats);
STATIC_DCL char *FDECL(anything_to_s, (char *, anything *, int));
STATIC_DCL void FDECL(s_to_anything, (anything *, char *, int));
@@ -320,69 +382,148 @@ bot()
#else /* STATUS_VIA_WINDOWPORT */
/* If entries are added to this, botl.h will require updating too */
struct istat_s blstats[2][MAXBLSTATS] = {
{
{ 0L, ANY_STR, {(genericptr_t)0L}, (char *)0, 80, 0 }, /* 0 BL_TITLE */
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0}, /* 1 BL_STR */
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0}, /* 2 BL_DX */
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0}, /* 3 BL_CO */
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0}, /* 4 BL_IN */
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0}, /* 5 BL_WI */
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0}, /* 6 BL_CH */
{ 0L, ANY_STR, {(genericptr_t)0L}, (char *)0, 40, 0}, /* 7 BL_ALIGN */
{ 0L, ANY_LONG, {(genericptr_t)0L}, (char *)0, 20, 0}, /* 8 BL_SCORE */
{ 0L, ANY_LONG, {(genericptr_t)0L}, (char *)0, 20, 0}, /* 9 BL_CAP */
{ 0L, ANY_LONG, {(genericptr_t)0L}, (char *)0, 30, 0}, /* 10 BL_GOLD */
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, BL_ENEMAX}, /* 11 BL_ENE */
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0}, /* 12 BL_ENEMAX */
{ 0L, ANY_LONG, {(genericptr_t)0L}, (char *)0, 10, 0}, /* 13 BL_XP */
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0}, /* 14 BL_AC */
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0}, /* 15 BL_HD */
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 20, 0}, /* 16 BL_TIME */
{ 0L, ANY_UINT, {(genericptr_t)0L}, (char *)0, 40, 0}, /* 17 BL_HUNGER */
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, BL_HPMAX}, /* 18 BL_HP */
{ 0L, ANY_INT, {(genericptr_t)0L}, (char *)0, 10, 0}, /* 19 BL_HPMAX */
{ 0L, ANY_STR, {(genericptr_t)0L}, (char *)0, 80, 0}, /* 20 BL_LEVELDESC */
{ 0L, ANY_LONG, {(genericptr_t)0L}, (char *)0, 20, 0}, /* 21 BL_EXP */
{ 0L, ANY_MASK32,{(genericptr_t)0L},(char *)0, 0, 0} /* 22 BL_CONDITION */
}
};
static boolean blinit = FALSE, update_all = FALSE;
const char *status_fieldnames[] = {
"title", "strength", "dexterity", "constitution", "intelligence",
"wisdom", "charisma", "alignment", "score", "carrying-capacity", "gold",
"power", "power-max", "experience-level", "armor-class", "HD", "time",
"hunger", "hitpoints", "hitpoints-max", "dungeon-level", "experience",
"condition"
};
void
status_initialize(reassessment)
boolean
reassessment; /* TRUE = just reassess fields w/o other initialization*/
{
int i;
const char *fieldfmts[] = { "%s", " St:%s", " Dx:%s", " Co:%s",
" In:%s", " Wi:%s", " Ch:%s", " %s",
" S:%s", " %s", " %s", " Pw:%s",
"(%s)", " Xp:%s", " AC:%s", " HD:%s",
" T:%s", " %s", " HP:%s", "(%s)",
"%s", "/%s", "%s" };
const char *fieldfmt = (const char *)0;
const char *fieldname = (const char *)0;
if (!reassessment) {
init_blstats();
(*windowprocs.win_status_init)();
blinit = TRUE;
}
for (i = 0; i < MAXBLSTATS; ++i) {
if ((i == BL_SCORE && !flags.showscore)
|| (i == BL_EXP && !flags.showexp)
|| (i == BL_TIME && !flags.time) || (i == BL_HD && !Upolyd)
|| ((i == BL_XP || i == BL_EXP) && Upolyd))
status_enablefield(i, status_fieldnames[i], fieldfmts[i], FALSE);
else
status_enablefield(i, status_fieldnames[i], fieldfmts[i], TRUE);
enum statusfields fld = initblstats[i].fld;
switch (fld) {
case BL_TITLE:
fieldfmt = "%s";
fieldname = "title";
status_enablefield(fld, fieldname, fieldfmt, TRUE);
break;
case BL_STR:
fieldfmt = " St:%s";
fieldname = "strength";
status_enablefield(fld, fieldname, fieldfmt, TRUE);
break;
case BL_DX:
fieldfmt = " Dx:%s";
fieldname = "dexterity";
status_enablefield(fld, fieldname, fieldfmt, TRUE);
break;
case BL_CO:
fieldfmt = " Co:%s";
fieldname = "constitution";
status_enablefield(fld, fieldname, fieldfmt, TRUE);
break;
case BL_IN:
fieldfmt = " In:%s";
fieldname = "intelligence";
status_enablefield(fld, fieldname, fieldfmt, TRUE);
break;
case BL_WI:
fieldfmt = " Wi:%s";
fieldname = "wisdom";
status_enablefield(fld, fieldname, fieldfmt, TRUE);
break;
case BL_CH:
fieldfmt = " Ch:%s";
fieldname = "charisma";
status_enablefield(fld, fieldname, fieldfmt, TRUE);
break;
case BL_ALIGN:
fieldfmt = " %s";
fieldname = "alignment";
status_enablefield(fld, fieldname, fieldfmt, TRUE);
break;
case BL_SCORE:
fieldfmt = " S:%s";
fieldname = "score";
status_enablefield(fld, fieldname, fieldfmt,
(!flags.showscore) ? FALSE : TRUE);
break;
case BL_CAP:
fieldfmt = " %s";
fieldname = "carrying-capacity";
status_enablefield(fld, fieldname, fieldfmt, TRUE);
break;
case BL_GOLD:
fieldfmt = " %s";
fieldname = "gold";
status_enablefield(fld, fieldname, fieldfmt, TRUE);
break;
case BL_ENE:
fieldfmt = " Pw:%s";
fieldname = "power";
status_enablefield(fld, fieldname, fieldfmt, TRUE);
break;
case BL_ENEMAX:
fieldfmt = "(%s)";
fieldname = "power-max";
status_enablefield(fld, fieldname, fieldfmt, TRUE);
break;
case BL_XP:
fieldfmt = " Xp:%s";
fieldname = "experience-level";
status_enablefield(fld, fieldname, fieldfmt,
(Upolyd) ? FALSE : TRUE);
break;
case BL_AC:
fieldfmt = " AC:%s";
fieldname = "armor-class";
status_enablefield(fld, fieldname, fieldfmt, TRUE);
break;
case BL_HD:
fieldfmt = " HD:%s";
fieldname = "HD";
status_enablefield(fld, fieldname, fieldfmt,
(!Upolyd) ? FALSE : TRUE);
break;
case BL_TIME:
fieldfmt = " T:%s";
fieldname = "time";
status_enablefield(fld, fieldname, fieldfmt,
(!flags.time) ? FALSE : TRUE);
break;
case BL_HUNGER:
fieldfmt = " %s";
fieldname = "hunger";
status_enablefield(fld, fieldname, fieldfmt, TRUE);
break;
case BL_HP:
fieldfmt = " HP:%s";
fieldname = "hitpoints";
status_enablefield(fld, fieldname, fieldfmt, TRUE);
break;
case BL_HPMAX:
fieldfmt = "(%s)";
fieldname = "hitpoint-max";
status_enablefield(fld, fieldname, fieldfmt, TRUE);
break;
case BL_LEVELDESC:
fieldfmt = "%s";
fieldname = "dungeon-level";
status_enablefield(fld, fieldname, fieldfmt, TRUE);
break;
case BL_EXP:
fieldfmt = "/%s";
fieldname = "experience";
status_enablefield(fld, fieldname, fieldfmt,
(!flags.showexp || Upolyd) ? FALSE : TRUE);
break;
case BL_CONDITION:
fieldfmt = "%S";
fieldname = "condition";
status_enablefield(fld, fieldname, fieldfmt, TRUE);
break;
case BL_BOGUS:
default:
break;
}
}
update_all = TRUE;
}
@@ -407,20 +548,24 @@ status_finish()
STATIC_OVL void
init_blstats()
{
int i;
static boolean initalready = FALSE;
int i, j;
for (i = 0; i < MAXBLSTATS; ++i) {
/* ensure initial field values set on blstats[1][i] too */
blstats[1][i] = blstats[0][i];
if (initalready) {
impossible("init_blstats called more than once.");
return;
}
blstats[0][i].a = zeroany;
blstats[1][i].a = zeroany;
if (blstats[0][i].valwidth) {
blstats[0][i].val = (char *) alloc(blstats[0][i].valwidth);
blstats[1][i].val = (char *) alloc(blstats[0][i].valwidth);
} else {
blstats[0][i].val = (char *) 0;
blstats[1][i].val = (char *) 0;
initalready = TRUE;
for (i = BEFORE; i <= NOW; ++i) {
for (j = 0; j < MAXBLSTATS; ++j) {
blstats[i][j] = initblstats[j];
blstats[i][j].a = zeroany;
if (blstats[i][j].valwidth) {
blstats[i][j].val = (char *) alloc(blstats[i][j].valwidth);
blstats[i][j].val[0] = '\0';
} else
blstats[i][j].val = (char *) 0;
}
}
}
@@ -887,10 +1032,10 @@ bot()
* text display obliterates the status line.
*
* To work around it, we call status_update() with ficticious
* index of BL_FLUSH (-1).
* index of BL_BOGUS (-1).
*/
if (context.botlx && !updated)
status_update(BL_FLUSH, (genericptr_t) 0, 0, 0);
status_update(BL_BOGUS, (genericptr_t) 0, 0, 0);
context.botl = context.botlx = 0;
update_all = FALSE;
@@ -991,17 +1136,18 @@ char *sa, *sb, *sc, *sd;
boolean normal[2] = { 0, 0 };
boolean percent = FALSE, down_up = FALSE, changed = FALSE;
anything threshold;
enum statusfields fld = BL_BOGUS;
threshold.a_void = 0;
/* Example:
* hilite_status: hitpoints/10%/red/normal
*/
/* field name to idx */
for (i = 0; sa && i < MAXBLSTATS; ++i) {
if (strcmpi(sa, status_fieldnames[i]) == 0) {
/* field name to statusfield */
for (i = 0; sa && i < SIZE(fieldids); ++i) {
if (strcmpi(sa, fieldids[i].fieldname) == 0) {
idx = i;
fld = fieldids[i].fldid;
break;
}
}
@@ -1016,8 +1162,8 @@ char *sa, *sb, *sc, *sd;
|| (strcmpi(sb, "up") == 0) || (strcmpi(sb, "down") == 0)) {
down_up = TRUE;
} else if ((strcmpi(sb, "changed") == 0)
&& (idx == BL_TITLE || idx == BL_ALIGN || idx == BL_LEVELDESC
|| idx == BL_CONDITION)) {
&& (fld == BL_TITLE || fld == BL_ALIGN || fld == BL_LEVELDESC
|| fld == BL_CONDITION)) {
changed = TRUE; /* changed is only thing allowed */
} else {
tmp = sb;
@@ -1146,9 +1292,9 @@ int bufsiz;
Strcat(buf, " ");
bufsiz--;
}
k = strlen(status_fieldnames[i]);
k = strlen(fieldids[i].fieldname);
if (k < bufsiz) {
Strcat(buf, status_fieldnames[i]);
Strcat(buf, fieldids[i].fieldname);
bufsiz -= k;
}
if (bufsiz > 1) {
@@ -1239,7 +1385,7 @@ status_hilite_menu()
start_menu(tmpwin);
for (i = 0; i < MAXBLSTATS; i++) {
(void) memset(&hltemp[i], 0, sizeof(struct hilite_s));
fieldname = status_fieldnames[i];
fieldname = fieldids[i].fieldname;
any.a_int = i + 1;
add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, fieldname,
MENU_UNSELECTED);
@@ -1262,7 +1408,7 @@ status_hilite_menu()
if (field_picks[i]) {
menu_item *pick = (menu_item *) 0;
Sprintf(buf, "Threshold behavior options for %s:",
status_fieldnames[i]);
fieldids[i].fieldname);
tmpwin = create_nhwindow(NHW_MENU);
start_menu(tmpwin);
if (i == BL_CONDITION) {
@@ -1301,12 +1447,12 @@ status_hilite_menu()
return FALSE;
if (hltemp[i].behavior == BL_TH_UPDOWN) {
Sprintf(below, "%s decreases", status_fieldnames[i]);
Sprintf(above, "%s increases", status_fieldnames[i]);
Sprintf(below, "%s decreases", fieldids[i].fieldname);
Sprintf(above, "%s increases", fieldids[i].fieldname);
} else if (hltemp[i].behavior) {
/* Have them enter the threshold*/
Sprintf(
buf, "Set %s threshold to what%s?", status_fieldnames[i],
buf, "Set %s threshold to what%s?", fieldids[i].fieldname,
(hltemp[i].behavior == BL_TH_VAL_PERCENTAGE)
? " percentage"
: (hltemp[i].behavior == BL_TH_CONDITION) ? " mask"
@@ -1319,11 +1465,11 @@ status_hilite_menu()
if (!hltemp[i].threshold.a_void)
return FALSE;
Sprintf(below, "%s falls below %s%s", status_fieldnames[i],
Sprintf(below, "%s falls below %s%s", fieldids[i].fieldname,
thresholdbuf,
(hltemp[i].behavior == BL_TH_VAL_PERCENTAGE) ? "%"
: "");
Sprintf(above, "%s rises above %s%s", status_fieldnames[i],
Sprintf(above, "%s rises above %s%s", fieldids[i].fieldname,
thresholdbuf,
(hltemp[i].behavior == BL_TH_VAL_PERCENTAGE) ? "%"
: "");
@@ -1368,7 +1514,7 @@ status_hilite_menu()
buf[0] = '\0';
for (i = 0; i < MAXBLSTATS; i++) {
if (field_picks[i]) {
Sprintf(eos(buf), "%s/%s%s/", status_fieldnames[i],
Sprintf(eos(buf), "%s/%s%s/", fieldids[i].fieldname,
(hltemp[i].behavior == BL_TH_UPDOWN)
? "updown"
: anything_to_s(thresholdbuf, &hltemp[i].threshold,
@@ -1457,14 +1603,16 @@ genericptr_t ptr;
long cond, *condptr = (long *) ptr;
register int i;
char *text = (char *) ptr;
int fieldorder1[] = { BL_TITLE, BL_STR, BL_DX, BL_CO, BL_IN,
BL_WI, BL_CH, BL_ALIGN, BL_SCORE, -1 };
int fieldorder2[] = { BL_LEVELDESC, BL_GOLD, BL_HP, BL_HPMAX,
BL_ENE, BL_ENEMAX, BL_AC, BL_XP,
BL_EXP, BL_HD, BL_TIME, BL_HUNGER,
BL_CAP, BL_CONDITION, -1 };
if (idx != BL_FLUSH) {
enum statusfields fieldorder[2][15] = {
{ BL_TITLE, BL_STR, BL_DX, BL_CO, BL_IN, BL_WI, BL_CH, BL_ALIGN,
BL_SCORE, BL_BOGUS, BL_BOGUS, BL_BOGUS, BL_BOGUS, BL_BOGUS, BL_BOGUS},
{ BL_LEVELDESC, BL_GOLD, BL_HP, BL_HPMAX, BL_ENE, BL_ENEMAX,
BL_AC, BL_XP, BL_EXP, BL_HD, BL_TIME, BL_HUNGER,
BL_CAP, BL_CONDITION, BL_BOGUS}
};
if (idx != BL_BOGUS) {
if (!activefields[idx])
return;
switch (idx) {
@@ -1494,14 +1642,14 @@ genericptr_t ptr;
/* This genl version updates everything on the display, everytime */
newbot1[0] = '\0';
for (i = 0; fieldorder1[i] >= 0; ++i) {
int idx1 = fieldorder1[i];
for (i = 0; fieldorder[0][i] != BL_BOGUS; ++i) {
int idx1 = fieldorder[0][i];
if (activefields[idx1])
Strcat(newbot1, vals[idx1]);
}
newbot2[0] = '\0';
for (i = 0; fieldorder2[i] >= 0; ++i) {
int idx2 = fieldorder2[i];
for (i = 0; fieldorder[1][i] != BL_BOGUS; ++i) {
int idx2 = fieldorder[1][i];
if (activefields[idx2])
Strcat(newbot2, vals[idx2]);
}