1stMud4.5.3/
1stMud4.5.3/backup/
1stMud4.5.3/bin/
1stMud4.5.3/bin/extras/
1stMud4.5.3/data/i3/
1stMud4.5.3/doc/1stMud/
1stMud4.5.3/doc/Diku/
1stMud4.5.3/doc/MPDocs/
1stMud4.5.3/doc/Rom/
1stMud4.5.3/notes/
/**************************************************************************
*  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;
	}

	add_text(MXPTAG("Prompt"), point);

	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;
	add_text(MXPTAG("/Prompt"), point);
	d_print(ch->desc, buf);
	if (!NullStr(ch->prefix))
		d_print(ch->desc, ch->prefix);
	return;
}
#endif