The point of making a prompt in this manner (as opposed to using some of the other methods) was to keep it more "standard" and closer to "stock". This prompt package changes do_display in manner which is very much in keeping with the original code, and it modifies make_prompt using the standard convention of CCxxx(ch, C_xxx) as opposed to turning to a raw ANSI or inline color scheme. In order to handle the very common desire to see exceedingly low vitals flash, a few minor changes to screen.h were required. (Completely in keeping with the "stock" #defines already within the file.) The prompt supports one additional toggle for do_display beyond what stock delivers. It will now switch between #h #m #v > and #h/#H #m/#M #v/#V > allowing more player satisfaction with minimum complexity. The levels at which colors change and the colors themselves are easily modified, just read through the code. The flashing text will only fire at color level complete. My theory on color levels is that everything should have basic color at normal, with the complex ANSI which many terminals cannot handle being at complete. If you disagree, feel free to change those parts. :) The percentage code for this prompt was taken from the Duris prompt package put together by Fafrd. The rest of the changes are mine. Credit is, as usual, only required if you really feel the need to credit everyone. This took one half of an evening for a poor coder, it is not something mind-bending to figure out. :) Should take about 10 minutes to install. -Mathew Earle Reuther (aka Corwynn) *** Changes made to update for a color changing prompt in bpl 21/22: BEGIN COLOR PROMPT WALKTHROUGH BEGIN ACT.OTHER.C In do_display, modify the line which shows options: ! send_to_char(ch, "Usage: prompt { { H | M | V } | all | none | maximum | current }\r\n"); Just above the off and none else if statement, add these two else if statements: + else if (!str_cmp(argument, "maximum")) + SET_BIT(PRF_FLAGS(ch), PRF_DISPMAX); + else if (!str_cmp(argument, "current")) + REMOVE_BIT(PRF_FLAGS(ch), PRF_DISPMAX); END ACT.OTHER.C BEGIN COMM.C At the top, add an include for screen.h (since we are now colorizing something in here): +#include "screen.h" Replace your make_prompt with the following function: +char *make_prompt(struct descriptor_data *d) +{ + static char prompt[MAX_PROMPT_LENGTH]; + int percent; + + /* Note, prompt is truncated at MAX_PROMPT_LENGTH chars (structs.h) */ + + if (d->showstr_count) { + snprintf(prompt, sizeof(prompt), + "\r\n[ Return to continue, (q)uit, (r)efresh, (b)ack, or page number (%d/%d) ]", + d->showstr_page, d->showstr_count); + } else if (d->str) + strcpy(prompt, "] "); + else if (STATE(d) == CON_PLAYING && !IS_NPC(d->character)) { + + + if (PRF_FLAGGED(d->character, PRF_BUILDWALK)) + strcpy(prompt, "< BuildWalking Mode ACTIVE! > "); + else { + + int count; + size_t len = 0; + + *prompt = '\0'; + + if (GET_INVIS_LEV(d->character) && len < sizeof(prompt)) { + count = snprintf(prompt + len, sizeof(prompt) - len, "i%d ", GET_INVIS_LEV(d->character)); + if (count >= 0) + len += count; + } + + if (PRF_FLAGGED(d->character, PRF_DISPMAX)) { + if (PRF_FLAGGED(d->character, PRF_DISPHP) && len < sizeof(prompt)) { + if (GET_MAX_HIT(d->character) > 0) + percent = (100 * GET_HIT(d->character)) / GET_MAX_HIT(d->character); + else + percent = -1; + + if (percent >= 90) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dh/%dH%s ", + CCWHT(d->character, C_NRM), GET_HIT(d->character), GET_MAX_HIT(d->character), CCNRM(d->character, C_NRM)); + } else if (percent >= 66) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dh/%dH%s ", + CCGRN(d->character, C_NRM), GET_HIT(d->character), GET_MAX_HIT(d->character), CCNRM(d->character, C_NRM)); + } else if (percent >= 33) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dh/%dH%s ", + CCYEL(d->character, C_NRM), GET_HIT(d->character), GET_MAX_HIT(d->character), CCNRM(d->character, C_NRM)); + } else if (percent >= 15) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dh/%dH%s ", + CCRED(d->character, C_NRM), GET_HIT(d->character), GET_MAX_HIT(d->character), CCNRM(d->character, C_NRM)); + } else { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%s%dh/%dH%s ", + CCRED(d->character, C_NRM), CCBLN(d->character, C_CMP), GET_HIT(d->character), GET_MAX_HIT(d->character), CCNRM(d->character, C_NRM)); + } + + if (count >= 0) + len += count; + } + + if (PRF_FLAGGED(d->character, PRF_DISPMANA) && len < sizeof(prompt)) { + if (GET_MAX_MANA(d->character) > 0) + percent = (100 * GET_MANA(d->character)) / GET_MAX_MANA(d->character); + else + percent = -1; + + if (percent >= 90) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dm/%dM%s ", + CCWHT(d->character, C_NRM), GET_MANA(d->character), GET_MAX_MANA(d->character), CCNRM(d->character, C_NRM)); + } else if (percent >= 66) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dm/%dM%s ", + CCGRN(d->character, C_NRM), GET_MANA(d->character), GET_MAX_MANA(d->character), CCNRM(d->character, C_NRM)); + } else if (percent >= 33) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dm/%dM%s ", + CCYEL(d->character, C_NRM), GET_MANA(d->character), GET_MAX_MANA(d->character), CCNRM(d->character, C_NRM)); + } else if (percent >= 15) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dm/%dM%s ", + CCRED(d->character, C_NRM), GET_MANA(d->character), GET_MAX_MANA(d->character), CCNRM(d->character, C_NRM)); + } else { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%s%dm/%dM%s ", + CCRED(d->character, C_NRM), CCBLN(d->character, C_CMP), GET_MANA(d->character), GET_MAX_MANA(d->character), CCNRM(d->character, C_NRM)); + } + + if (count >= 0) + len += count; + } + + if (PRF_FLAGGED(d->character, PRF_DISPMOVE) && len < sizeof(prompt)) { + if (GET_MAX_MOVE(d->character) > 0) + percent = (100 * GET_MOVE(d->character)) / GET_MAX_MOVE(d->character); + else + percent = -1; + + if (percent >= 90) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dv/%dV%s ", + CCWHT(d->character, C_NRM), GET_MOVE(d->character), GET_MAX_MOVE(d->character), CCNRM(d->character, C_NRM)); + } else if (percent >= 66) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dv/%dV%s ", + CCGRN(d->character, C_NRM), GET_MOVE(d->character), GET_MAX_MOVE(d->character), CCNRM(d->character, C_NRM)); + } else if (percent >= 33) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dv/%dV%s ", + CCYEL(d->character, C_NRM), GET_MOVE(d->character), GET_MAX_MOVE(d->character), CCNRM(d->character, C_NRM)); + } else if (percent >= 15) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dv/%dV%s ", + CCRED(d->character, C_NRM), GET_MOVE(d->character), GET_MAX_MOVE(d->character), CCNRM(d->character, C_NRM)); + } else { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%s%dv/%dV%s ", + CCRED(d->character, C_NRM), CCBLN(d->character, C_CMP), GET_MOVE(d->character), GET_MAX_MOVE(d->character), CCNRM(d->character, C_NRM)); + } + + if (count >= 0) + len += count; + } + + } else { + if (PRF_FLAGGED(d->character, PRF_DISPHP) && len < sizeof(prompt)) { + if (GET_MAX_HIT(d->character) > 0) + percent = (100 * GET_HIT(d->character)) / GET_MAX_HIT(d->character); + else + percent = -1; + + if (percent >= 90) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dh%s ", + CCWHT(d->character, C_NRM), GET_HIT(d->character), CCNRM(d->character, C_NRM)); + } else if (percent >= 66) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dh%s ", + CCGRN(d->character, C_NRM), GET_HIT(d->character), CCNRM(d->character, C_NRM)); + } else if (percent >= 33) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dh%s ", + CCYEL(d->character, C_NRM), GET_HIT(d->character), CCNRM(d->character, C_NRM)); + } else if (percent >= 15) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dh%s ", + CCRED(d->character, C_NRM), GET_HIT(d->character), CCNRM(d->character, C_NRM)); + } else { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%s%dh%s ", + CCRED(d->character, C_NRM), CCBLD(d->character, C_CMP), GET_HIT(d->character), CCNRM(d->character, C_NRM)); + } + + if (count >= 0) + len += count; + } + + if (PRF_FLAGGED(d->character, PRF_DISPMANA) && len < sizeof(prompt)) { + if (GET_MAX_MANA(d->character) > 0) + percent = (100 * GET_MANA(d->character)) / GET_MAX_MANA(d->character); + else + percent = -1; + + if (percent >= 90) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dm%s ", + CCWHT(d->character, C_NRM), GET_MANA(d->character), CCNRM(d->character, C_NRM)); + } else if (percent >= 66) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dm%s ", + CCGRN(d->character, C_NRM), GET_MANA(d->character), CCNRM(d->character, C_NRM)); + } else if (percent >= 33) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dm%s ", + CCYEL(d->character, C_NRM), GET_MANA(d->character), CCNRM(d->character, C_NRM)); + } else if (percent >= 15) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dm%s ", + CCRED(d->character, C_NRM), GET_MANA(d->character), CCNRM(d->character, C_NRM)); + } else { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%s%dm%s ", + CCRED(d->character, C_NRM), CCBLD(d->character, C_CMP), GET_MANA(d->character), CCNRM(d->character, C_NRM)); + } + + if (count >= 0) + len += count; + } + + if (PRF_FLAGGED(d->character, PRF_DISPMOVE) && len < sizeof(prompt)) { + if (GET_MAX_MOVE(d->character) > 0) + percent = (100 * GET_MOVE(d->character)) / GET_MAX_MOVE(d->character); + else + percent = -1; + + if (percent >= 90) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dv%s ", + CCWHT(d->character, C_NRM), GET_MOVE(d->character), CCNRM(d->character, C_NRM)); + } else if (percent >= 66) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dv%s ", + CCGRN(d->character, C_NRM), GET_MOVE(d->character), CCNRM(d->character, C_NRM)); + } else if (percent >= 33) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dv%s ", + CCYEL(d->character, C_NRM), GET_MOVE(d->character), CCNRM(d->character, C_NRM)); + } else if (percent >= 15) { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%dv%s ", + CCRED(d->character, C_NRM), GET_MOVE(d->character), CCNRM(d->character, C_NRM)); + } else { + count = snprintf(prompt + len, sizeof(prompt) - len, "%s%s%dv%s ", + CCRED(d->character, C_NRM), CCBLD(d->character, C_CMP), GET_MOVE(d->character), CCNRM(d->character, C_NRM)); + } + + if (count >= 0) + len += count; + } + } + + if (len < sizeof(prompt)) + strncat(prompt, "> ", sizeof(prompt) - len - 1); /* strncat: OK */ + } + + } else if (STATE(d) == CON_PLAYING && IS_NPC(d->character)) + snprintf(prompt, sizeof(prompt), "%s> ", GET_NAME(d->character)); + else + *prompt = '\0'; + + return (prompt); +} END COMM.C BEGIN CONSTANTS.C Add an entry in preference_bits for you new maximum prf flag: "D_MAX", END CONSTANTS.C BEGIN SCREEN.H I added in a few defines here, only two of which are used in the prompt itself (K/CCBLN): +/* New defines */ +#define KBLD "\033[1m" +#define KDAR "\033[2m" +#define KBLN "\033[5m" +#define CCBLD(ch,lvl) (clr((ch),(lvl))?KBLD:KNUL) +#define CCBLN(ch,lvl) (clr((ch),(lvl))?KBLN:KNUL) +#define CCDAR(ch,lvl) (clr((ch),(lvl))?KDAR:KNUL) +#define QBLD CCBLD(ch,C_SPR) /* Not recommended for use! This is too low a color level! */ +#define QDAR CCDAR(ch,C_SPR) /* Not recommended for use! This is too low a color level! */ +#define QBLN CCBLN(ch,C_SPR) /* Not recommended for use! This is too low a color level! */ END SCREEN.H BEGIN STRUCTS.H Add your define for the PRF flag needed: #define PRF_DISPMAX (1 << 24) /* Display max values in prompt */ END STRUCTS.H END COLOR PROMPT WALKTHROUGH