From e892eb521777303803dbc1174278d3802e929706 Mon Sep 17 00:00:00 2001 From: PatR Date: Thu, 19 Sep 2024 22:43:09 -0700 Subject: [PATCH] curses: remove old, unused status code The second half of win/curses/cursstat.c was bracketed by #if 0/#endif Chances of any of that ever being resurrected are just abou nil. --- win/curses/cursstat.c | 946 ------------------------------------------ 1 file changed, 946 deletions(-) diff --git a/win/curses/cursstat.c b/win/curses/cursstat.c index 310ba7820..15168f845 100644 --- a/win/curses/cursstat.c +++ b/win/curses/cursstat.c @@ -1377,950 +1377,4 @@ nhattr2curses(int attrmask) } #endif /* STATUS_HILITES */ -/* ======================================================================== */ - - -#if 0 /* old stuff; some may be re-incorporated, most should be discarded */ -/* Private declarations */ - -/* Used to track previous value of things, to highlight changes. */ -typedef struct nhs { - long value; - int highlight_turns; - int highlight_color; -} nhstat; - -static attr_t get_trouble_color(const char *); -static void draw_trouble_str(const char *); -static void print_statdiff(const char *append, nhstat *, long, int); -static void get_playerrank(char *); -static int hpen_color(boolean, int, int); -static void draw_bar(boolean, int, int, const char *); -static void draw_horizontal(int, int, int, int); -static void draw_horizontal_new(int, int, int, int); -static void draw_vertical(int, int, int, int); -static void curses_add_statuses(WINDOW *, boolean, boolean, int *, int *); -static void curses_add_status(WINDOW *, boolean, boolean, int *, int *, - const char *, int); -static int decrement_highlight(nhstat *, boolean); - -#ifdef STATUS_COLORS -static attr_t hpen_color_attr(boolean, int, int); -extern struct color_option text_color_of(const char *text, - const struct text_color_option *color_options); -struct color_option percentage_color_of(int value, int max, - const struct percent_color_option *color_options); - -extern const struct text_color_option *text_colors; -extern const struct percent_color_option *hp_colors; -extern const struct percent_color_option *pw_colors; -#endif - -/* Whether or not we have printed status window content at least once. - Used to ensure that prev* doesn't end up highlighted on game start. */ -static boolean first = TRUE; -static nhstat prevdepth; -static nhstat prevstr; -static nhstat prevint; -static nhstat prevwis; -static nhstat prevdex; -static nhstat prevcon; -static nhstat prevcha; -static nhstat prevau; -static nhstat prevlevel; -static nhstat prevac; -static nhstat prevexp; -static nhstat prevtime; - -#ifdef SCORE_ON_BOTL -static nhstat prevscore; -#endif - -extern const char *const hu_stat[]; /* from eat.c */ -extern const char *const enc_stat[]; /* from botl.c */ - -/* If the statuscolors patch isn't enabled, have some default colors for status problems - anyway */ - -struct statcolor { - const char *txt; /* For status problems */ - int color; /* Default color assuming STATUS_COLORS isn't enabled */ -}; - -static const struct statcolor default_colors[] = { - {"Satiated", CLR_YELLOW}, - {"Hungry", CLR_YELLOW}, - {"Weak", CLR_ORANGE}, - {"Fainted", CLR_BRIGHT_MAGENTA}, - {"Fainting", CLR_BRIGHT_MAGENTA}, - {"Burdened", CLR_RED}, - {"Stressed", CLR_RED}, - {"Strained", CLR_ORANGE}, - {"Overtaxed", CLR_ORANGE}, - {"Overloaded", CLR_BRIGHT_MAGENTA}, - {"Conf", CLR_BRIGHT_BLUE}, - {"Blind", CLR_BRIGHT_BLUE}, - {"Stun", CLR_BRIGHT_BLUE}, - {"Hallu", CLR_BRIGHT_BLUE}, - {"Ill", CLR_BRIGHT_MAGENTA}, - {"FoodPois", CLR_BRIGHT_MAGENTA}, - {"Slime", CLR_BRIGHT_MAGENTA}, - {NULL, NULL, NO_COLOR}, -}; - -static attr_t -get_trouble_color(const char *stat) -{ - attr_t res = curses_color_attr(CLR_GRAY, 0); - const struct statcolor *clr; - for (clr = default_colors; clr->txt; clr++) { - if (stat && !strcmp(clr->txt, stat)) { -#ifdef STATUS_COLORS - /* Check if we have a color enabled with statuscolors */ - if (!iflags.use_status_colors) - return curses_color_attr(CLR_GRAY, 0); /* no color configured */ - - struct color_option stat_color; - - stat_color = text_color_of(clr->txt, text_colors); - if (stat_color.color == NO_COLOR && !stat_color.attr_bits) - return curses_color_attr(CLR_GRAY, 0); - - if (stat_color.color != NO_COLOR) - res = curses_color_attr(stat_color.color, 0); - - res = curses_color_attr(stat_color.color, 0); - int count; - for (count = 0; (1 << count) <= stat_color.attr_bits; count++) { - if (count != ATR_NONE && - (stat_color.attr_bits & (1 << count))) - res |= curses_convert_attr(count); - } - - return res; -#else - return curses_color_attr(clr->color, 0); -#endif - } - } - - return res; -} - -/* TODO: This is in the wrong place. */ -void -get_playerrank(char *rank) -{ - char buf[BUFSZ]; - if (Upolyd) { - int k = 0; - - Strcpy(buf, pmname(&mons[u.umonnum], flags.female ? FEMALE : MALE)); - while(buf[k] != 0) { - if ((k == 0 || (k > 0 && buf[k-1] == ' ')) && - 'a' <= buf[k] && buf[k] <= 'z') - buf[k] += 'A' - 'a'; - k++; - } - Strcpy(rank, buf); - } else - Strcpy(rank, rank_of(u.ulevel, Role_switch, flags.female)); -} - -/* Handles numerical stat changes of various kinds. - type is generally STAT_OTHER (generic "do nothing special"), - but is used if the stat needs to be handled in a special way. */ -static void -print_statdiff(const char *append, nhstat *stat, long new, int type) -{ - char buf[BUFSZ]; - WINDOW *win = curses_get_nhwin(STATUS_WIN); - - int color = CLR_GRAY; - - /* Turncount isn't highlighted, or it would be highlighted constantly. */ - if (type != STAT_TIME && new != stat->value) { - /* Less AC is better */ - if ((type == STAT_AC && new < stat->value) || - (type != STAT_AC && new > stat->value)) { - color = STAT_UP_COLOR; - if (type == STAT_GOLD) - color = HI_GOLD; - } else - color = STAT_DOWN_COLOR; - - stat->value = new; - stat->highlight_color = color; - stat->highlight_turns = 5; - } else if (stat->highlight_turns) - color = stat->highlight_color; - - attr_t attr = curses_color_attr(color, 0); - wattron(win, attr); - wprintw(win, "%s", append); - if (type == STAT_STR && new > 18) { - if (new > 118) - wprintw(win, "%d", new - 100); - else if (new == 118) - wprintw(win, "18/**"); - else - wprintw(win, "18/%02d", new - 18); - } else - wprintw(win, "%d", new); - - wattroff(win, attr); -} - -static void -draw_trouble_str(const char *str) -{ - WINDOW *win = curses_get_nhwin(STATUS_WIN); - - attr_t attr = get_trouble_color(str); - wattron(win, attr); - wprintw(win, "%s", str); - wattroff(win, attr); -} - -/* Returns a ncurses attribute for foreground and background. - This should probably be in cursinit.c or something. */ -attr_t -curses_color_attr(int nh_color, int bg_color) -{ - int color = nh_color + 1; - attr_t cattr = A_NORMAL; - - if (!nh_color) { -#ifdef USE_DARKGRAY - if (iflags.wc2_darkgray) { - if (COLORS <= 16) - cattr |= A_BOLD; - } else -#endif - color = COLOR_BLUE; - } - - if (COLORS < 16 && color > 8) { - color -= 8; - cattr = A_BOLD; - } - - /* Can we do background colors? We can if we have more than - 16*7 colors (more than 8*7 for terminals with bold) */ - if (COLOR_PAIRS > (COLORS >= 16 ? 16 : 8) * 7) { - /* NH3 has a rather overcomplicated way of defining - its colors past the first 16: - Pair Foreground Background - 17 Black Red - 18 Black Blue - 19 Red Red - 20 Red Blue - 21 Green Red - ... - (Foreground order: Black, Red, Green, Yellow, Blue, - Magenta, Cyan, Gray/White) - - To work around these oddities, we define backgrounds - by the following pairs: - - 16 COLORS - 49-64: Green - 65-80: Yellow - 81-96: Magenta - 97-112: Cyan - 113-128: Gray/White - - 8 COLORS - 9-16: Green - 33-40: Yellow - 41-48: Magenta - 49-56: Cyan - 57-64: Gray/White */ - - if (bg_color == nh_color) - color = 1; /* Make foreground black if fg==bg */ - - if (bg_color == CLR_RED || bg_color == CLR_BLUE) { - /* already defined before extension */ - color *= 2; - color += 16; - if (bg_color == CLR_RED) - color--; - } else { - boolean hicolor = FALSE; - if (COLORS >= 16) - hicolor = TRUE; - - switch (bg_color) { - case CLR_GREEN: - color = (hicolor ? 48 : 8) + color; - break; - case CLR_BROWN: - color = (hicolor ? 64 : 32) + color; - break; - case CLR_MAGENTA: - color = (hicolor ? 80 : 40) + color; - break; - case CLR_CYAN: - color = (hicolor ? 96 : 48) + color; - break; - case CLR_GRAY: - color = (hicolor ? 112 : 56) + color; - break; - default: - break; - } - } - } - cattr |= COLOR_PAIR(color); - - return cattr; -} - -/* Returns a complete curses attribute. - Used to possibly bold/underline/etc HP/Pw. */ -#ifdef STATUS_COLORS -static attr_t -hpen_color_attr(boolean is_hp, int cur, int max) -{ - struct color_option stat_color; - int count; - attr_t attr = 0; - if (!iflags.use_status_colors) - return curses_color_attr(CLR_GRAY, 0); - - stat_color = percentage_color_of(cur, max, is_hp ? hp_colors : pw_colors); - - if (stat_color.color != NO_COLOR) - attr |= curses_color_attr(stat_color.color, 0); - - for (count = 0; (1 << count) <= stat_color.attr_bits; count++) { - if (count != ATR_NONE && (stat_color.attr_bits & (1 << count))) - attr |= curses_convert_attr(count); - } - - return attr; -} -#endif - -/* Return color for the HP bar. - With status colors ON, this respect its configuration (defaulting to gray), - but only obeys the color (no weird attributes for the HP bar). - With status colors OFF, this returns reasonable defaults which are also - used for the HP/Pw text itself. */ -static int -hpen_color(boolean is_hp, int cur, int max) -{ -#ifdef STATUS_COLORS - if (iflags.use_status_colors) { - struct color_option stat_color; - stat_color = percentage_color_of(cur, max, - is_hp ? hp_colors : pw_colors); - - if (stat_color.color == NO_COLOR) - return CLR_GRAY; - else - return stat_color.color; - } else - return CLR_GRAY; -#endif - - int color = CLR_GRAY; - if (cur == max) - color = CLR_GRAY; - else if (cur * 3 > max * 2) /* >2/3 */ - color = is_hp ? CLR_GREEN : CLR_CYAN; - else if (cur * 3 > max) /* >1/3 */ - color = is_hp ? CLR_YELLOW : CLR_BLUE; - else if (cur * 7 > max) /* >1/7 */ - color = is_hp ? CLR_RED : CLR_MAGENTA; - else - color = is_hp ? CLR_ORANGE : CLR_BRIGHT_MAGENTA; - - return color; -} - -/* Draws a bar - is_hp: TRUE if we're drawing HP, Pw otherwise (determines colors) - cur/max: Current/max HP/Pw - title: Not NULL if we are drawing as part of an existing title. - Otherwise, the format is as follows: [ 11 / 11 ] */ -static void -draw_bar(boolean is_hp, int cur, int max, const char *title) -{ - WINDOW *win = curses_get_nhwin(STATUS_WIN); - -#ifdef STATUS_COLORS - if (!iflags.hitpointbar) { - wprintw(win, "%s", !title ? "---" : title); - return; - } -#endif - - char buf[BUFSZ]; - if (title) - Strcpy(buf, title); - else { - int len = 5; - sprintf(buf, "%*d / %-*d", len, cur, len, max); - } - - /* Colors */ - attr_t fillattr, attr; - int color = hpen_color(is_hp, cur, max); - int invcolor = color & 7; - - fillattr = curses_color_attr(color, invcolor); - attr = curses_color_attr(color, 0); - - /* Figure out how much of the bar to fill */ - int fill = 0; - int len = strlen(buf); - if (cur > 0 && max > 0) - fill = len * cur / max; - if (fill > len) - fill = len; - - waddch(win, '['); - wattron(win, fillattr); - wprintw(win, "%.*s", fill, buf); - wattroff(win, fillattr); - wattron(win, attr); - wprintw(win, "%.*s", len - fill, &buf[fill]); - wattroff(win, attr); - waddch(win, ']'); -} - -/* Update the status win - this is called when NetHack would normally - write to the status window, so we know something has changed. We - override the write and update what needs to be updated ourselves. */ -void -curses_update_stats(void) -{ - WINDOW *win = curses_get_nhwin(STATUS_WIN); - orient statorient = (orient) curses_get_window_orientation(STATUS_WIN); - boolean horiz = (statorient != ALIGN_RIGHT && statorient != ALIGN_LEFT); - boolean border = curses_window_has_border(STATUS_WIN); - - /* Clear the window */ - werase(win); - - /* Figure out if we have proper window dimensions for horizontal status */ - if (horiz) { - /* correct y */ - int cy = 3; - if (iflags.statuslines < 3) - cy = 2; - - /* actual y (and x) */ - int ax = 0; - int ay = 0; - getmaxyx(win, ay, ax); - if (border) - ay -= 2; - - if (cy != ay) { - curses_create_main_windows(); - curses_last_messages(); - docrt(); - - /* Reset XP highlight (since classic_status and new show - different numbers) */ - prevexp.highlight_turns = 0; - curses_update_stats(); - return; - } - } - - /* Starting x/y. Passed to draw_horizontal/draw_vertical to keep track of - window positioning. */ - int x = 0; - int y = 0; - - /* Don't start at border position if applicable */ - if (border) { - x++; - y++; - } - - /* Get HP values. */ - int hp = u.uhp; - int hpmax = u.uhpmax; - if (Upolyd) { - hp = u.mh; - hpmax = u.mhmax; - } - - if (horiz) - draw_horizontal(x, y, hp, hpmax); - else - draw_vertical(x, y, hp, hpmax); - - if (border) - box(win, 0, 0); - - wnoutrefresh(win); - - if (first) { - first = FALSE; - - /* Zero highlight timers. This will call curses_update_status again - if needed */ - curses_decrement_highlights(TRUE); - } -} - -static void -draw_horizontal(int x, int y, int hp, int hpmax) -{ - if (iflags.statuslines >= 3) { - /* Draw new-style statusbar */ - draw_horizontal_new(x, y, hp, hpmax); - return; - } - char buf[BUFSZ]; - char rank[BUFSZ]; - WINDOW *win = curses_get_nhwin(STATUS_WIN); - - /* Line 1 */ - wmove(win, y, x); - - get_playerrank(rank); - sprintf(buf, "%s the %s", svp.plname, rank); - - /* Use the title as HP bar (similar to hitpointbar) */ - draw_bar(TRUE, hp, hpmax, buf); - - /* Attributes */ - print_statdiff(" St:", &prevstr, ACURR(A_STR), STAT_STR); - print_statdiff(" Dx:", &prevdex, ACURR(A_DEX), STAT_OTHER); - print_statdiff(" Co:", &prevcon, ACURR(A_CON), STAT_OTHER); - print_statdiff(" In:", &prevint, ACURR(A_INT), STAT_OTHER); - print_statdiff(" Wi:", &prevwis, ACURR(A_WIS), STAT_OTHER); - print_statdiff(" Ch:", &prevcha, ACURR(A_CHA), STAT_OTHER); - - wprintw(win, (u.ualign.type == A_CHAOTIC ? " Chaotic" : - u.ualign.type == A_NEUTRAL ? " Neutral" : " Lawful")); - -#ifdef SCORE_ON_BOTL - if (flags.showscore) - print_statdiff(" S:", &prevscore, botl_score(), STAT_OTHER); -#endif /* SCORE_ON_BOTL */ - - - /* Line 2 */ - y++; - wmove(win, y, x); - - describe_level(buf, 0); - - wprintw(win, "%s", buf); - - print_statdiff("$", &prevau, money_cnt(gi.invent), STAT_GOLD); - - /* HP/Pw use special coloring rules */ - attr_t hpattr, pwattr; -#ifdef STATUS_COLORS - hpattr = hpen_color_attr(TRUE, hp, hpmax); - pwattr = hpen_color_attr(FALSE, u.uen, u.uenmax); -#else - int hpcolor, pwcolor; - hpcolor = hpen_color(TRUE, hp, hpmax); - pwcolor = hpen_color(FALSE, u.uen, u.uenmax); - hpattr = curses_color_attr(hpcolor, 0); - pwattr = curses_color_attr(pwcolor, 0); -#endif - wprintw(win, " HP:"); - wattron(win, hpattr); - wprintw(win, "%d(%d)", (hp < 0) ? 0 : hp, hpmax); - wattroff(win, hpattr); - - wprintw(win, " Pw:"); - wattron(win, pwattr); - wprintw(win, "%d(%d)", u.uen, u.uenmax); - wattroff(win, pwattr); - - print_statdiff(" AC:", &prevac, u.uac, STAT_AC); - - if (Upolyd) - print_statdiff(" HD:", &prevlevel, mons[u.umonnum].mlevel, STAT_OTHER); - else if (flags.showexp) { - print_statdiff(" Xp:", &prevlevel, u.ulevel, STAT_OTHER); - /* use waddch, we don't want to highlight the '/' */ - waddch(win, '/'); - print_statdiff("", &prevexp, u.uexp, STAT_OTHER); - } - else - print_statdiff(" Exp:", &prevlevel, u.ulevel, STAT_OTHER); - - if (flags.time) - print_statdiff(" T:", &prevtime, svm.moves, STAT_TIME); - - curses_add_statuses(win, FALSE, FALSE, NULL, NULL); -} - -static void -draw_horizontal_new(int x, int y, int hp, int hpmax) -{ - char buf[BUFSZ]; - char rank[BUFSZ]; - WINDOW *win = curses_get_nhwin(STATUS_WIN); - - /* Line 1 */ - wmove(win, y, x); - - get_playerrank(rank); - char race[BUFSZ]; - Strcpy(race, gu.urace.adj); - race[0] = highc(race[0]); - wprintw(win, "%s the %s %s%s%s", svp.plname, - (u.ualign.type == A_CHAOTIC ? "Chaotic" : - u.ualign.type == A_NEUTRAL ? "Neutral" : "Lawful"), - Upolyd ? "" : race, Upolyd ? "" : " ", - rank); - - /* Line 2 */ - y++; - wmove(win, y, x); - wprintw(win, "HP:"); - draw_bar(TRUE, hp, hpmax, NULL); - print_statdiff(" AC:", &prevac, u.uac, STAT_AC); - if (Upolyd) - print_statdiff(" HD:", &prevlevel, mons[u.umonnum].mlevel, STAT_OTHER); - else if (flags.showexp) { - /* Ensure that Xp have proper highlight on level change. */ - int levelchange = 0; - if (prevlevel.value != u.ulevel) { - if (prevlevel.value < u.ulevel) - levelchange = 1; - else - levelchange = 2; - } - print_statdiff(" Xp:", &prevlevel, u.ulevel, STAT_OTHER); - /* use waddch, we don't want to highlight the '/' */ - waddch(win, '('); - - /* Figure out amount of Xp needed to next level */ - int xp_left = 0; - if (u.ulevel < 30) - xp_left = (newuexp(u.ulevel) - u.uexp); - - if (levelchange) { - prevexp.value = (xp_left + 1); - if (levelchange == 2) - prevexp.value = (xp_left - 1); - } - print_statdiff("", &prevexp, xp_left, STAT_AC); - waddch(win, ')'); - } - else - print_statdiff(" Exp:", &prevlevel, u.ulevel, STAT_OTHER); - - waddch(win, ' '); - describe_level(buf); - - wprintw(win, "%s", buf); - - /* Line 3 */ - y++; - wmove(win, y, x); - wprintw(win, "Pw:"); - draw_bar(FALSE, u.uen, u.uenmax, NULL); - - print_statdiff(" $", &prevau, money_cnt(gi.invent), STAT_GOLD); - -#ifdef SCORE_ON_BOTL - if (flags.showscore) - print_statdiff(" S:", &prevscore, botl_score(), STAT_OTHER); -#endif /* SCORE_ON_BOTL */ - - if (flags.time) - print_statdiff(" T:", &prevtime, svm.moves, STAT_TIME); - - curses_add_statuses(win, TRUE, FALSE, &x, &y); - - /* Right-aligned attributes */ - int stat_length = 6; /* " Dx:xx" */ - int str_length = 6; - if (ACURR(A_STR) > 18 && ACURR(A_STR) < 119) - str_length = 9; - - getmaxyx(win, y, x); - - /* We want to deal with top line of y. getmaxx would do what we want, but it only - exist for compatibility reasons and might not exist at all in some versions. */ - y = 0; - if (curses_window_has_border(STATUS_WIN)) { - x--; - y++; - } - - x -= stat_length; - int orig_x = x; - wmove(win, y, x); - print_statdiff(" Co:", &prevcon, ACURR(A_CON), STAT_OTHER); - x -= stat_length; - wmove(win, y, x); - print_statdiff(" Dx:", &prevdex, ACURR(A_DEX), STAT_OTHER); - x -= str_length; - wmove(win, y, x); - print_statdiff(" St:", &prevstr, ACURR(A_STR), STAT_STR); - - x = orig_x; - y++; - wmove(win, y, x); - print_statdiff(" Ch:", &prevcha, ACURR(A_CHA), STAT_OTHER); - x -= stat_length; - wmove(win, y, x); - print_statdiff(" Wi:", &prevwis, ACURR(A_WIS), STAT_OTHER); - x -= str_length; - wmove(win, y, x); - print_statdiff(" In:", &prevint, ACURR(A_INT), STAT_OTHER); -} - -/* Personally I never understood the point of a vertical status bar. But removing the - option would be silly, so keep the functionality. */ -static void -draw_vertical(int x, int y, int hp, int hpmax) -{ - char buf[BUFSZ]; - char rank[BUFSZ]; - WINDOW *win = curses_get_nhwin(STATUS_WIN); - - /* Print title and dungeon branch */ - wmove(win, y++, x); - - get_playerrank(rank); - int ranklen = strlen(rank); - int namelen = strlen(svp.plname); - int maxlen = 19; -#ifdef STATUS_COLORS - if (!iflags.hitpointbar) - maxlen += 2; /* With no hitpointbar, we can fit more since there's no "[]" */ -#endif - - if ((ranklen + namelen) > maxlen) { - /* The result doesn't fit. Strip name if >10 characters, then strip title */ - if (namelen > 10) { - while (namelen > 10 && (ranklen + namelen) > maxlen) - namelen--; - } - - while ((ranklen + namelen) > maxlen) - ranklen--; /* Still doesn't fit, strip rank */ - } - sprintf(buf, "%-*s the %-*s", namelen, svp.plname, ranklen, rank); - draw_bar(TRUE, hp, hpmax, buf); - wmove(win, y++, x); - wprintw(win, "%s", dungeons[u.uz.dnum].dname); - - y++; /* Blank line in-between */ - wmove(win, y++, x); - - /* Attributes. Old vertical order is preserved */ - print_statdiff("Strength: ", &prevstr, ACURR(A_STR), STAT_STR); - wmove(win, y++, x); - print_statdiff("Intelligence: ", &prevint, ACURR(A_INT), STAT_OTHER); - wmove(win, y++, x); - print_statdiff("Wisdom: ", &prevwis, ACURR(A_WIS), STAT_OTHER); - wmove(win, y++, x); - print_statdiff("Dexterity: ", &prevdex, ACURR(A_DEX), STAT_OTHER); - wmove(win, y++, x); - print_statdiff("Constitution: ", &prevcon, ACURR(A_CON), STAT_OTHER); - wmove(win, y++, x); - print_statdiff("Charisma: ", &prevcha, ACURR(A_CHA), STAT_OTHER); - wmove(win, y++, x); - wprintw(win, "Alignment: "); - wprintw(win, (u.ualign.type == A_CHAOTIC ? "Chaotic" : - u.ualign.type == A_NEUTRAL ? "Neutral" : "Lawful")); - wmove(win, y++, x); - wprintw(win, "Dungeon Level: "); - - /* Astral Plane doesn't fit */ - if (In_endgame(&u.uz)) - wprintw(win, "%s", Is_astralevel(&u.uz) ? "Astral" : "End Game"); - else - wprintw(win, "%d", depth(&u.uz)); - wmove(win, y++, x); - - print_statdiff("Gold: ", &prevau, money_cnt(gi.invent), STAT_GOLD); - wmove(win, y++, x); - - /* HP/Pw use special coloring rules */ - attr_t hpattr, pwattr; -#ifdef STATUS_COLORS - hpattr = hpen_color_attr(TRUE, hp, hpmax); - pwattr = hpen_color_attr(FALSE, u.uen, u.uenmax); -#else - int hpcolor, pwcolor; - hpcolor = hpen_color(TRUE, hp, hpmax); - pwcolor = hpen_color(FALSE, u.uen, u.uenmax); - hpattr = curses_color_attr(hpcolor, 0); - pwattr = curses_color_attr(pwcolor, 0); -#endif - - wprintw(win, "Hit Points: "); - wattron(win, hpattr); - wprintw(win, "%d/%d", (hp < 0) ? 0 : hp, hpmax); - wattroff(win, hpattr); - wmove(win, y++, x); - - wprintw(win, "Magic Power: "); - wattron(win, pwattr); - wprintw(win, "%d/%d", u.uen, u.uenmax); - wattroff(win, pwattr); - wmove(win, y++, x); - - print_statdiff("Armor Class: ", &prevac, u.uac, STAT_AC); - wmove(win, y++, x); - - if (Upolyd) - print_statdiff("Hit Dice: ", &prevlevel, mons[u.umonnum].mlevel, - STAT_OTHER); - else if (flags.showexp) { - print_statdiff("Experience: ", &prevlevel, u.ulevel, STAT_OTHER); - /* use waddch, we don't want to highlight the '/' */ - waddch(win, '/'); - print_statdiff("", &prevexp, u.uexp, STAT_OTHER); - } - else - print_statdiff("Level: ", &prevlevel, u.ulevel, STAT_OTHER); - wmove(win, y++, x); - - if (flags.time) { - print_statdiff("Time: ", &prevtime, svm.moves, STAT_TIME); - wmove(win, y++, x); - } - -#ifdef SCORE_ON_BOTL - if (flags.showscore) { - print_statdiff("Score: ", &prevscore, botl_score(), - STAT_OTHER); - wmove(win, y++, x); - } -#endif /* SCORE_ON_BOTL */ - - curses_add_statuses(win, FALSE, TRUE, &x, &y); -} - -static void -curses_add_statuses(WINDOW *win, boolean align_right, - boolean vertical, int *x, int *y) -{ - if (align_right) { - /* Right-aligned statuses. Since add_status decrease one x more - (to separate them with spaces), add 1 to x unless we have borders - (which would offset what add_status does) */ - int mx = *x; - int my = *y; - getmaxyx(win, my, mx); - if (!curses_window_has_border(STATUS_WIN)) - mx++; - - *x = mx; - } - -#define statprob(str, trouble) \ - curses_add_status(win, align_right, vertical, x, y, str, trouble) - - /* Hunger */ - statprob(hu_stat[u.uhs], u.uhs != 1); /* 1 is NOT_HUNGRY (not defined here) */ - - /* General troubles */ - statprob("Conf", Confusion); - statprob("Blind", Blind); - statprob("Stun", Stunned); - statprob("Hallu", Hallucination); - statprob("Ill", (u.usick_type & SICK_NONVOMITABLE)); - statprob("FoodPois", (u.usick_type & SICK_VOMITABLE)); - statprob("Slime", Slimed); - - /* Encumbrance */ - int enc = near_capacity(); - statprob(enc_stat[enc], enc > UNENCUMBERED); -#undef statprob -} - -static void -curses_add_status(WINDOW *win, boolean align_right, boolean vertical, - int *x, int *y, const char *str, int trouble) -{ - /* If vertical is TRUE here with no x/y, that's an error. But handle - it gracefully since NH3 doesn't recover well in crashes. */ - if (!x || !y) - vertical = FALSE; - - if (!trouble) - return; - - if (!vertical && !align_right) - waddch(win, ' '); - - /* For whatever reason, hunger states have trailing spaces. Get rid of - them. */ - char buf[BUFSZ]; - Strcpy(buf, str); - int i; - for (i = 0; (buf[i] != ' ' && buf[i] != '\0'); i++) ; - - buf[i] = '\0'; - if (align_right) { - *x -= (strlen(buf) + 1); /* add spacing */ - wmove(win, *y, *x); - } - - draw_trouble_str(buf); - - if (vertical) { - wmove(win, *y, *x); - *y += 1; /* ++ advances the pointer addr */ - } -} - -/* Decrement a single highlight, return 1 if decremented to zero. zero is TRUE if we're - zeroing the highlight. */ -static int -decrement_highlight(nhstat *stat, boolean zero) -{ - if (stat->highlight_turns > 0) { - if (zero) { - stat->highlight_turns = 0; - return 1; - } - - stat->highlight_turns--; - if (stat->highlight_turns == 0) - return 1; - } - return 0; -} - -/* Decrement the highlight_turns for all stats. Call curses_update_stats - if needed to unhighlight a stat */ -void -curses_decrement_highlights(boolean zero) -{ - int unhighlight = 0; - - unhighlight |= decrement_highlight(&prevdepth, zero); - unhighlight |= decrement_highlight(&prevstr, zero); - unhighlight |= decrement_highlight(&prevdex, zero); - unhighlight |= decrement_highlight(&prevcon, zero); - unhighlight |= decrement_highlight(&prevint, zero); - unhighlight |= decrement_highlight(&prevwis, zero); - unhighlight |= decrement_highlight(&prevcha, zero); - unhighlight |= decrement_highlight(&prevau, zero); - unhighlight |= decrement_highlight(&prevlevel, zero); - unhighlight |= decrement_highlight(&prevac, zero); - unhighlight |= decrement_highlight(&prevexp, zero); - unhighlight |= decrement_highlight(&prevtime, zero); -#ifdef SCORE_ON_BOTL - unhighlight |= decrement_highlight(&prevscore, zero); -#endif - - if (unhighlight) - curses_update_stats(); -} -#endif /*0*/ - /*cursstat.c*/