From: nhmall Date: Sun, 31 May 2015 02:22:39 +0000 (-0400) Subject: some updates X-Git-Tag: NetHack-3.6.0_RC01~324 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4ccbf2edc8ef485d8f14fcfe5964acb477af3dfa;p=nethack some updates Changes to be committed: modified: include/botl.h modified: src/botl.c --- diff --git a/include/botl.h b/include/botl.h index 284338261..6ffb75fb2 100644 --- a/include/botl.h +++ b/include/botl.h @@ -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 */ diff --git a/src/botl.c b/src/botl.c index a2d8f3ba6..9ad736af3 100644 --- a/src/botl.c +++ b/src/botl.c @@ -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]; - - 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; + if (initalready) { + impossible("init_blstats called more than once."); + return; + } + + 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]); }