From ddbea3b72701acd513be3d4a18b1514a453fdd03 Mon Sep 17 00:00:00 2001 From: Ray Chason Date: Wed, 12 Aug 2026 02:23:23 -0400 Subject: [PATCH] Implement remaining status labels --- win/X11/winstat.c | 181 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 146 insertions(+), 35 deletions(-) diff --git a/win/X11/winstat.c b/win/X11/winstat.c index 5e5d34cc5..08d5f7e22 100644 --- a/win/X11/winstat.c +++ b/win/X11/winstat.c @@ -94,13 +94,28 @@ #define F_HALLU 40 #define F_VERS 41 /* version info */ -#define NUM_STATS 42 + +#define F_WEAPON 42 +#define F_ARMOR 43 +#define F_TERRAIN 44 +#define F_BAREH 45 +#define F_GLOWHANDS 46 +#define F_ICY 47 +#define F_BUSY 48 +#define F_PARALYZED 49 +#define F_SLEEPING 50 +#define F_UNCONSCIOUS 51 +#define F_IRON 52 +#define F_SLIPPERY 53 +#define F_SUBMERGED 54 +#define F_WOUNDEDL 55 +#define NUM_STATS 56 static int condcolor(long, unsigned long *); static int condattr(long, unsigned long *); static Widget create_tty_status(Widget, Widget); static void stat_resized(Widget, XtPointer, XtPointer); -static void update_fancy_status_field(int, int, int); +static void update_fancy_status_field(int, const char *, int, int); static void update_fancy_status(boolean); static Widget create_fancy_status(Widget, Widget); static void destroy_fancy_status(struct xwindow *); @@ -412,6 +427,9 @@ X11_status_update_fancy( { BL_HPMAX, F_MAXHP }, { BL_LEVELDESC, F_DLEVEL }, { BL_VERS, F_VERS }, + { BL_WEAPON, F_WEAPON }, + { BL_ARMOR, F_ARMOR }, + { BL_TERRAIN, F_TERRAIN }, { BL_EXP, F_EXP_PTS } }; static const struct mask_to_ff { @@ -436,6 +454,17 @@ X11_status_update_fancy( { BL_MASK_TETHERED, F_TETHERED }, { BL_MASK_LEV, F_LEV }, { BL_MASK_FLY, F_FLY }, + { BL_MASK_BAREH, F_BAREH }, + { BL_MASK_GLOWHANDS, F_GLOWHANDS }, + { BL_MASK_ICY, F_ICY }, + { BL_MASK_BUSY, F_BUSY }, + { BL_MASK_PARLYZ, F_PARALYZED }, + { BL_MASK_SLEEPING, F_SLEEPING }, + { BL_MASK_UNCONSC, F_UNCONSCIOUS }, + { BL_MASK_ELF_IRON, F_IRON }, + { BL_MASK_SLIPPERY, F_SLIPPERY }, + { BL_MASK_SUBMERGED, F_SUBMERGED }, + { BL_MASK_WOUNDEDL, F_WOUNDEDL }, { BL_MASK_RIDE, F_RIDE } }; int i; @@ -457,6 +486,7 @@ X11_status_update_fancy( for (i = 0; i < SIZE(mask_to_fancyfield); i++) if ((changed_bits & mask_to_fancyfield[i].mask) != 0L) update_fancy_status_field(mask_to_fancyfield[i].ff, + NULL, condcolor(mask_to_fancyfield[i].mask, colormasks), condattr(mask_to_fancyfield[i].mask, colormasks)); old_condition_bits = X11_condition_bits; /* remember 'On' bits */ @@ -471,7 +501,8 @@ X11_status_update_fancy( for (i = 0; i < SIZE(bl_to_fancyfield); i++) if (bl_to_fancyfield[i].bl == fld) { - update_fancy_status_field(bl_to_fancyfield[i].ff, colr, attr); + update_fancy_status_field(bl_to_fancyfield[i].ff, + (const char *) ptr, colr, attr); break; } @@ -1205,7 +1236,7 @@ struct f_overload { static const struct f_overload *ff_ovld_from_mask(unsigned long); static const struct f_overload *ff_ovld_from_indx(int); -static void update_val(struct X_status_value *, long); +static void update_val(struct X_status_value *, long, const char *); static void skip_cond_val(struct X_status_value *); static void update_color(struct X_status_value *, int); static Pixel color_to_pixel(Widget, int); @@ -1293,6 +1324,20 @@ static struct X_status_value shown_stats[NUM_STATS] = { { "Hallucinat", SV_NAME, W0, 0L, 0, FALSE, TRUE, FALSE, P0, 0, 0 }, /* F_VERS; optionally shown, generally treated as a pseudo-condition */ { "Version 1.2.3", SV_LABEL, W0, 0L, 0, FALSE, FALSE, FALSE, P0, 0, 0 }, + { "Weapon", SV_NAME, W0, -1L, 0, FALSE, FALSE, FALSE, P0, 0, 0 }, + { "Armor", SV_NAME, W0, -1L, 0, FALSE, FALSE, FALSE, P0, 0, 0 }, + { "Terrain", SV_NAME, W0, -1L, 0, FALSE, FALSE, FALSE, P0, 0, 0 }, + { "BareHands", SV_NAME, W0, 0L, 0, FALSE, TRUE, FALSE, P0, 0, 0 }, + { "GlowHands", SV_NAME, W0, 0L, 0, FALSE, TRUE, FALSE, P0, 0, 0 }, + { "Icy", SV_NAME, W0, 0L, 0, FALSE, TRUE, FALSE, P0, 0, 0 }, + { "Busy", SV_NAME, W0, 0L, 0, FALSE, TRUE, FALSE, P0, 0, 0 }, + { "Paralyzed", SV_NAME, W0, 0L, 0, FALSE, TRUE, FALSE, P0, 0, 0 }, + { "Sleeping", SV_NAME, W0, 0L, 0, FALSE, TRUE, FALSE, P0, 0, 0 }, + { "Unconsc", SV_NAME, W0, 0L, 0, FALSE, TRUE, FALSE, P0, 0, 0 }, + { "ElfIron", SV_NAME, W0, 0L, 0, FALSE, TRUE, FALSE, P0, 0, 0 }, + { "Slippery", SV_NAME, W0, 0L, 0, FALSE, TRUE, FALSE, P0, 0, 0 }, + { "Submerged", SV_NAME, W0, 0L, 0, FALSE, TRUE, FALSE, P0, 0, 0 }, + { "HurtLegs", SV_NAME, W0, 0L, 0, FALSE, TRUE, FALSE, P0, 0, 0 }, }; #undef W0 #undef P0 @@ -1325,14 +1370,12 @@ static const struct f_overload cond_ovl[] = { { { BL_MASK_HELD, F_HELD }, { BL_MASK_HOLDING, F_HOLDING } }, }, -#if 0 /* not yet implemented */ - { (BL_MASK_BUSY | BL_MASK_PARALYZ | BL_MASK_SLEEPING | BL_MASK_UNCONSC), + { (BL_MASK_BUSY | BL_MASK_PARLYZ | BL_MASK_SLEEPING | BL_MASK_UNCONSC), { { BL_MASK_BUSY, F_BUSY }, /* can't move but none of the below... */ - { BL_MASK_PARALYZ, F_PARALYZED } - { BL_MASK_SLEEPING, F_SLEEPING } + { BL_MASK_PARLYZ, F_PARALYZED }, + { BL_MASK_SLEEPING, F_SLEEPING }, { BL_MASK_UNCONSC, F_UNCONSCIOUS } }, }, -#endif }; static const struct f_overload * @@ -1398,7 +1441,7 @@ null_out_status(void) DISABLE_WARNING_FORMAT_NONLITERAL static void -update_val(struct X_status_value *attr_rec, long new_value) +update_val(struct X_status_value *attr_rec, long new_value, const char *new_valuestr) { static boolean Exp_shown = TRUE, time_shown = TRUE, score_shown = TRUE, Xp_was_HD = FALSE; @@ -1452,7 +1495,10 @@ update_val(struct X_status_value *attr_rec, long new_value) X11_update_label(attr_rec->w); } else if (attr_rec->type == SV_NAME) { - if (attr_rec->last_value == new_value) + boolean direct = attr_rec == &shown_stats[F_ARMOR] + || attr_rec == &shown_stats[F_WEAPON] + || attr_rec == &shown_stats[F_TERRAIN]; + if (!direct && attr_rec->last_value == new_value) return; /* no change */ attr_rec->last_value = new_value; @@ -1465,6 +1511,11 @@ update_val(struct X_status_value *attr_rec, long new_value) Strcpy(buf, enc_stat[new_value]); } else if (new_value) { Strcpy(buf, attr_rec->name); /* condition name On */ + /* Special cases: weapon, armor and terrain */ + } else if (direct) { + if (new_valuestr == NULL) + return; + Strcpy(buf, new_valuestr); } else { *buf = '\0'; /* condition name Off */ } @@ -1537,7 +1588,7 @@ update_val(struct X_status_value *attr_rec, long new_value) /* core won't call status_update() for Exp when it hasn't changed so do so ourselves (to get Exp_shown flag to match display) */ if (force_update) - update_fancy_status_field(F_EXP_PTS, NO_COLOR, HL_UNDEF); + update_fancy_status_field(F_EXP_PTS, NULL, NO_COLOR, HL_UNDEF); } if (attr_rec->last_value == new_value && !force_update) /* same */ @@ -1598,6 +1649,7 @@ update_val(struct X_status_value *attr_rec, long new_value) already highlighted and being set to blank */ if (attr_rec != &shown_stats[F_TIME] && attr_rec != &shown_stats[F_VERS] + && attr_rec != &shown_stats[F_TERRAIN] && !attr_rec->set ^ !*buf) { if (attr_rec->type == SV_VALUE) X11_set_highlight(get_value_widget(attr_rec->w), TRUE); @@ -1716,7 +1768,7 @@ set_percent(int index, int percent, int color) * [***] version is optional, right-justified after conditions */ static void -update_fancy_status_field(int i, int color, int attributes) +update_fancy_status_field(int i, const char *valstr, int color, int attributes) { struct X_status_value *sv = &shown_stats[i]; unsigned long condmask = 0L; @@ -1816,6 +1868,39 @@ update_fancy_status_field(int i, int color, int attributes) case F_HALLU: condmask = BL_MASK_HALLU; break; + case F_BAREH: + condmask = BL_MASK_BAREH; + break; + case F_GLOWHANDS: + condmask = BL_MASK_GLOWHANDS; + break; + case F_ICY: + condmask = BL_MASK_ICY; + break; + case F_BUSY: + condmask = BL_MASK_BUSY; + break; + case F_PARALYZED: + condmask = BL_MASK_PARLYZ; + break; + case F_SLEEPING: + condmask = BL_MASK_SLEEPING; + break; + case F_UNCONSCIOUS: + condmask = BL_MASK_UNCONSC; + break; + case F_IRON: + condmask = BL_MASK_ELF_IRON; + break; + case F_SLIPPERY: + condmask = BL_MASK_SLIPPERY; + break; + case F_SUBMERGED: + condmask = BL_MASK_SUBMERGED; + break; + case F_WOUNDEDL: + condmask = BL_MASK_WOUNDEDL; + break; /* pseudo-condition */ case F_VERS: @@ -1867,6 +1952,11 @@ update_fancy_status_field(int i, int color, int attributes) val = 0L; #endif break; + case F_WEAPON: + case F_ARMOR: + case F_TERRAIN: + /* valstr is the value */ + break; default: { /* * There is a possible infinite loop that occurs with: @@ -1900,7 +1990,7 @@ update_fancy_status_field(int i, int color, int attributes) return; } } - update_val(sv, val); + update_val(sv, val, valstr); if (color != sv->colr) update_color(sv, color); if (attributes != sv->attr) @@ -1928,7 +2018,7 @@ update_fancy_status(boolean force_update) the no longer displayed field; we're a bit more conservative than that and do this when toggling on as well as off */ for (i = 0; i < NUM_STATS; i++) - update_fancy_status_field(i, NO_COLOR, HL_UNDEF); + update_fancy_status_field(i, NULL, NO_COLOR, HL_UNDEF); old_condition_bits = X11_condition_bits; old_upolyd = Upolyd; @@ -2010,6 +2100,17 @@ width_string(int sv_index) case F_STUN: case F_CONF: case F_HALLU: + case F_BAREH: + case F_GLOWHANDS: + case F_BUSY: + case F_PARALYZED: + case F_SLEEPING: + case F_UNCONSCIOUS: + case F_IRON: + case F_SLIPPERY: + case F_SUBMERGED: + case F_WOUNDEDL: + case F_ICY: return shown_stats[sv_index].name; case F_NAME: @@ -2035,6 +2136,12 @@ width_string(int sv_index) return "123456789"; /* a tenth digit will still fit legibly */ case F_ALIGN: return "Neutral"; + case F_WEAPON: + return "Dual+joust"; + case F_ARMOR: + return "GCAUHBS"; + case F_TERRAIN: + return "Portcullis"; } impossible("width_string: unknown index %d\n", sv_index); return ""; @@ -2224,32 +2331,36 @@ init_column( * two columns and might expand to more if 'hitpointbar' is implemented. * Version is optional, right justified, and much wider than the others. * - Title ("Plname the Rank") <> <> <> <> - Dungeon-Branch-and-Level <> Hunger Grabbed Held - Hit-points Max-HP Strength Encumbrance Petrifying Blind - Power-points Max-Power Dexterity Trapped Slimed Deaf - Armor-class Alignment Constitution Levitation Strangled Stunned - Xp-level [Exp-points] Intelligence Flying Food-Pois Confused - Gold [Score] Wisdom Riding Term-Ill Hallucinat - <> [Time] Charisma <> Sinking Version + Title ("Plname the Rank") <> <> <> <> <> + Dungeon-Branch-and-Level <> Weapon Hunger Grabbed Held + Hit-points Max-HP Strength Armor Encumbrance Petrifying Blind + Power-points Max-Power Dexterity Terrain Trapped Slimed Deaf + Armor-class Alignment Constitution <> Levitation Strangled Stunned + Xp-level [Exp-points] Intelligence <> Flying Food-Pois Confused + Gold [Score] Wisdom <> Riding Term-Ill Hallucinat + <> [Time] Charisma <> <> Sinking Version * - * A seventh column is going to be needed to fit in more conditions. + * An eighth column is going to be needed to fit in more conditions. */ -/* including F_DUMMY makes the three status condition columns evenly +/* including F_DUMMY makes the status condition columns evenly spaced with regard to the adjacent characteristics (Str,Dex,&c) column; we lose track of the Widget pointer for F_DUMMY, each use clobbering the one before, leaving the one from leftover_indices[]; since they're never updated, that shouldn't matter */ -static int status_indices[3][11] = { +static int status_indices[][11] = { + { F_DUMMY, F_WEAPON, F_ARMOR, F_TERRAIN, + F_BAREH, F_GLOWHANDS, F_ICY, F_DUMMY, -1, 0, 0 }, { F_DUMMY, F_HUNGER, F_ENCUMBER, F_TRAPPED, F_LEV, F_FLY, F_RIDE, F_DUMMY, -1, 0, 0 }, { F_DUMMY, F_GRABBED, F_STONE, F_SLIME, F_STRNGL, F_FOODPOIS, F_TERMILL, F_IN_LAVA, -1, 0, 0 }, { F_DUMMY, F_HELD, F_BLIND, F_DEAF, F_STUN, - F_CONF, F_HALLU, F_VERS, -1, 0, 0 }, + F_CONF, F_HALLU, F_DUMMY, -1, 0, 0 }, + { F_DUMMY, F_BUSY, F_IRON, F_SLIPPERY, + F_SUBMERGED, F_WOUNDEDL, F_DUMMY, F_VERS, -1, 0, 0 } }; -/* used to fill up the empty space to right of 3rd status condition column */ +/* used to fill up the empty space to right of last status condition column */ static int leftover_indices[] = { F_DUMMY, -1, 0, 0 }; /* -2: top two rows of these columns are reserved for title and location */ static int col1_indices[11 - 2] = { @@ -2335,7 +2446,7 @@ init_info_form(Widget parent, Widget top, Widget left) return form; } -/* give the three status condition columns the same width */ +/* give the status condition columns the same width */ static void fixup_cond_widths(void) { @@ -2343,7 +2454,7 @@ fixup_cond_widths(void) w1 = w2 = 0; for (pass = 1; pass <= 2; ++pass) { /* two passes... */ - for (i = 0; i < 3; i++) { /* three columns */ + for (i = 0; i < SIZE(status_indices); i++) { for (ip = status_indices[i]; *ip != -1; ++ip) { /* X fields */ /* pass 1: find -1; pass 2: update field widths, find -1 */ if (pass == 2) @@ -2373,11 +2484,11 @@ fixup_cond_widths(void) Dimension vers_width = 0; struct X_status_value *sv = &shown_stats[F_VERS]; - if (sv) { + if (sv->w) { XtSetArg(args[0], XtNwidth, &vers_width); XtGetValues(sv->w, args, ONE); if (vers_width) { - vers_width *= 3; + vers_width *= 2; XtSetArg(args[0], XtNwidth, vers_width); XtSetArg(args[1], nhStr(XtNjustify), XtJustifyRight); XtSetValues(sv->w, args, TWO); @@ -2416,15 +2527,15 @@ create_fancy_status(Widget parent, Widget top) w = init_column("status_characteristics", form, (Widget) 0, w, characteristics_indices, 15); #endif - for (i = 0; i < 3; i++) { + for (i = 0; i < SIZE(status_indices); i++) { Sprintf(buf, "status_condition%d", i + 1); w = init_column(buf, form, (Widget) 0, w, status_indices[i], 0); } - fixup_cond_widths(); /* make all 3 status_conditionN columns same width + fixup_cond_widths(); /* make all status_conditionN columns same width * (actually, the slot for F_VERS is much wider) */ /* TODO: * Calculate and set the width of the F_VERS widjet to be from the - * start of the third condition column through the right edge and + * start of the last condition column through the right edge and * get rid of the dummy column. */