/************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefiting. We hope that you share your changes too. What goes * * around, comes around. * *************************************************************************** * ROM 2.4 is copyright 1993-1998 Russ Taylor * * ROM has been brought to you by the ROM consortium * * Russ Taylor (rtaylor@hypercube.org) * * Gabrielle Taylor (gtaylor@hypercube.org) * * Brian Moore (zump@rom.org) * * By using this code, you have agreed to follow the terms of the * * ROM license, in the file Rom24/doc/rom.license * *************************************************************************** * 1stMud ROM Derivative (c) 2001-2004 by Markanth * * http://www.firstmud.com/ <markanth@firstmud.com> * * By using this code you have agreed to follow the term of * * the 1stMud license in ../doc/1stMud/LICENSE * ***************************************************************************/ #ifndef __COMM_PROMPT_H_ #define __COMM_PROMPT_H_ 1 void bust_a_group_prompt (CharData * ch) { int group_count = 0; int charmies_count = 0; bool pet_found = false; bool complete; CharData *gch; CharData *gvictim; const char *group_prompt; const char *src; char *dest; char *i; char result[MSL * 3]; char buf[MSL]; int lowest_percent; if (IsSet (ch->comm, COMM_AFK)) return; for (gch = ch->in_room->person_first; gch; gch = gch->next_in_room) { if (ch != gch && is_same_group (gch, ch)) { if (ch->pet == gch) pet_found = true; else if (!IsNPC (gch)) group_count++; else charmies_count++; } } if (!pet_found && !group_count) return; if (NullStr (ch->gprompt)) group_prompt = "%g[grp {R%hhp {B%mm {M%vmv{x]%G%p[pet {r%qhp {b%rm {m%smv{x>%P%C"; else group_prompt = ch->gprompt; dest = result; for (src = group_prompt; !NullStr (src); src++) { if (*src != '%') { *dest++ = *src; continue; } src++; if (*src == '\0') { chprintln (ch, "Your group prompt can't end with a single %"); return; } lowest_percent = 101; i = ""; switch (*src) { default: *dest++ = ' '; continue; break; case '%': *dest++ = '%'; continue; break; case 'c': i = NEWLINE; break; case 'C': *dest = '\0'; if (strlen (result) > 0) i = NEWLINE; break; case 'g': if (!group_count) { complete = false; for (src++; !complete; src++) { if (*src == '\0') { chprintln (ch, "Your group prompt needs a %G after the %g before it will be displayed."); return; } if (*src == '%') { src++; if (*src == 'G') { complete = true; continue; } if (*src == '\0') { chprintln (ch, "Your group prompt needs a %G after the %g before it will be displayed."); return; } } } continue; } break; case 'G': break; case 'p': if (!pet_found) { complete = false; for (src++; !complete; src++) { if (*src == '\0') { chprintln (ch, "Your group prompt needs a %P after the %p before it will be displayed."); return; } if (*src == '%') { src++; if (*src == 'P') { complete = true; continue; } if (*src == '\0') { chprintln (ch, "Your group prompt needs a %P after the %p before it will be displayed."); return; } } } continue; } break; case 'P': break; case 'h': if (group_count) { for (gch = ch->in_room->person_first; gch; gch = gch->next_in_room) { if (ch != gch && !IsNPC (gch) && ch->pet != gch && is_same_group (gch, ch) && gch->max_hit != 0) { if (Percent (gch->hit, gch->max_hit) < lowest_percent) { gvictim = gch; lowest_percent = Percent (gch->hit, gch->max_hit); } } } if (lowest_percent <= 100) { sprintf (buf, "%03d%%", lowest_percent); i = buf; } } break; case 'm': if (group_count) { for (gch = ch->in_room->person_first; gch; gch = gch->next_in_room) { if (ch != gch && !IsNPC (gch) && ch->pet != gch && is_same_group (gch, ch) && gch->max_mana != 0) { if (Percent (gch->mana, gch->max_mana) < lowest_percent) { gvictim = gch; lowest_percent = Percent (gch->mana, gch->max_mana); } } } if (lowest_percent <= 100) { sprintf (buf, "%03d%%", lowest_percent); i = buf; } } break; case 'v': if (group_count) { for (gch = ch->in_room->person_first; gch; gch = gch->next_in_room) { if (ch != gch && !IsNPC (gch) && ch->pet != gch && is_same_group (gch, ch) && gch->max_move != 0) { if (Percent (gch->move, gch->max_move) < lowest_percent) { gvictim = gch; lowest_percent = Percent (gch->move, gch->max_move); } } } if (lowest_percent <= 100) { sprintf (buf, "%03d%%", lowest_percent); i = buf; } } break; case 'q': if (pet_found && ch->pet->max_hit) { sprintf (buf, "%03ld%%", Percent (ch->pet->hit, ch->pet->max_hit)); i = buf; } break; case 'r': if (pet_found && ch->pet->max_mana) { sprintf (buf, "%03ld%%", Percent (ch->pet->mana, ch->pet->max_mana)); i = buf; } break; case 's': if (pet_found && ch->pet->max_move) { sprintf (buf, "%03ld%%", Percent (ch->pet->move, ch->pet->max_move)); i = buf; } break; case 'N': sprintf (buf, "%d", group_count); i = buf; break; case 'x': sprintf (buf, "%d", charmies_count); i = buf; break; } while ((*dest = *i) != '\0') { dest++; i++; } } *dest = '\0'; d_print (ch->desc, result); } void bust_a_prompt (CharData * ch) { char buf[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; const char *str; const char *i; char *point; char doors[MAX_INPUT_LENGTH]; ExitData *pexit; int door; point = buf; str = ch->prompt; bust_a_portal (ch); if (NullStr (str)) { d_printf (ch->desc, "<%ldhp %ldm %ldmv> %s", ch->hit, ch->mana, ch->move, ch->prefix); return; } if (IsSet (ch->comm, COMM_AFK)) { if (!IsNPC (ch) && !NullStr (ch->pcdata->afk_msg)) d_printf (ch->desc, "{y<{YAFK{y>{Y (%s{Y){x", ch->pcdata->afk_msg); else d_print (ch->desc, "{y<{YAFK{y>{x "); return; } d_print (ch->desc, MXPTAG ("Prompt")); for (str = ch->prompt; *str != '\0'; str++) { if (*str != '%') { *point++ = *str; continue; } ++str; buf2[0] = '\0'; i = ""; switch (*str) { default: break; case 'e': doors[0] = '\0'; for (door = 0; door < MAX_DIR; door++) { if ((pexit = ch->in_room->exit[door]) != NULL && pexit->u1.to_room != NULL && (can_see_room (ch, pexit->u1.to_room) || (IsAffected (ch, AFF_INFRARED) && !IsAffected (ch, AFF_BLIND))) && !IsSet (pexit->exit_info, EX_CLOSED)) { sprintf (doors + strlen (doors), MXPTAG ("Ex") "%c" MXPTAG ("/Ex"), toupper (dir_name[door][0])); } } sprintf (buf2, MXPTAG ("Rexits") "%s" MXPTAG ("/Rexits"), GetStr (doors, "none")); i = buf2; break; case 'c': strcpy (buf2, NEWLINE); i = buf2; break; case 'h': sprintf (buf2, MXPTAG ("Hp") "%ld" MXPTAG ("/Hp"), ch->hit); i = buf2; break; case 'H': sprintf (buf2, MXPTAG ("MaxHp") "%ld" MXPTAG ("/MaxHp"), ch->max_hit); i = buf2; break; case 'm': sprintf (buf2, MXPTAG ("Mana") "%ld" MXPTAG ("/Mana"), ch->mana); i = buf2; break; case 'M': sprintf (buf2, MXPTAG ("MaxMana") "%ld" MXPTAG ("/MaxMana"), ch->max_mana); i = buf2; break; case 'v': sprintf (buf2, MXPTAG ("Move") "%ld" MXPTAG ("/Move"), ch->move); i = buf2; break; case 'V': sprintf (buf2, MXPTAG ("MaxMove") "%ld" MXPTAG ("/MaxMove"), ch->max_move); i = buf2; break; case 'x': sprintf (buf2, "%d", ch->exp); i = buf2; break; case 'X': sprintf (buf2, "%d", IsNPC (ch) ? 0 : (ch->level + 1) * exp_per_level (ch, ch->pcdata->points) - ch->exp); i = buf2; break; case 'g': sprintf (buf2, "%ld", ch->gold); i = buf2; break; case 's': sprintf (buf2, "%ld", ch->silver); i = buf2; break; case 'b': sprintf (buf2, "%ld%%", Percent (ch->hit, ch->max_hit)); i = buf2; break; case 'B': if (ch->fighting) sprintf (buf2, "%ld%%", Percent (ch->fighting->hit, ch->fighting->max_hit)); else strcpy (buf2, "??"); i = buf2; break; case 'a': if (ch->level > 9) sprintf (buf2, "%d", ch->alignment); else sprintf (buf2, "%s", IsGood (ch) ? "good" : IsEvil (ch) ? "evil" : "neutral"); i = buf2; break; case 'r': if (ch->in_room != NULL) sprintf (buf2, "%s", check_blind (ch) && !room_is_dark (ch->in_room) ? ch->in_room->name : "darkness"); i = buf2; break; case 'R': if (IsImmortal (ch) && ch->in_room != NULL) sprintf (buf2, "%ld", ch->in_room->vnum); i = buf2; break; case 'Q': if (gquest_info.running != GQUEST_OFF) sprintf (buf2, "%d", gquest_info.timer); else sprintf (buf2, "%dn", gquest_info.timer); i = buf2; break; case 'z': if (IsImmortal (ch) && ch->in_room != NULL) sprintf (buf2, "%s", ch->in_room->area->name); i = buf2; break; case '%': sprintf (buf2, "%%"); i = buf2; break; case 'o': sprintf (buf2, MXPTAG ("Olc") "%s" MXPTAG ("/Olc"), olc_ed_name (ch->desc)); i = buf2; break; case 'O': sprintf (buf2, "%s", olc_ed_vnum (ch->desc)); i = buf2; break; case 'q': if (IsQuester (ch)) sprintf (buf2, "%d", ch->pcdata->quest.time); else strcpy (buf2, "0"); i = buf2; break; } while ((*point = *i) != '\0') ++point, ++i; } *point = NUL; d_print (ch->desc, buf); d_print (ch->desc, MXPTAG ("/Prompt")); if (!NullStr (ch->prefix)) d_print (ch->desc, ch->prefix); return; } #endif