/
bin/95/
docs/DM/
docs/creatures/
docs/objects/
docs/rooms/
docs/utils/
help/
log/
objmon/ddesc/
player/
post/
rooms/
util/
util/fing/
util/italk/
util/lev-reset/
util/lib/
util/list/
util/msg/
util/tdel/
util/vote/
util/wtfix/
/*
 * COMMAND13.C:
 * 
 *   Additional user routines:
 *		int channelemote(ply_ptr, cmnd)
 *				emote to entire channel (i.e. broadcast emote)
 *		int classemote(ply_ptr, cmnd)
 *				emote to same class (i.e. broadcast emote to class)
 *		int class_send(ply_ptr, cmnd)
 *				send broadcast message to same class
 *
 *		int prep_herb(ply_ptr,cmnd)
 *		int apply_herb(ply_ptr,cmnd)
 *		int ingest_herb(ply_ptr,cmnd)
 *		int eat_herb(ply_ptr,cmnd)
 *		int paste_herb(ply_ptr,cmnd)
 *		int use_herb(ply_ptr,cmnd)
 *              int eat(ply_ptr,cmnd)
 *              int describe_me(ply_ptr,cmnd)
 *
 *	(c) 1996-1997  Brooke Paul
 *
 */

#include "mstruct.h"
#include "mextern.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#ifdef DMALLOC
  #include "/usr/local/include/dmalloc.h"
#endif

/******************************************************************/
/*				channelemote				  */
/******************************************************************/

/* This command allows a player to echo a message unaccompanied by */
/* any message format, except for the players name at the beginning */

int channelemote(ply_ptr, cmnd)
creature	*ply_ptr;
cmd		*cmnd;
{
	room		*rom_ptr;
	int		index = -1, j, i, fd;

	fd = ply_ptr->fd;
	rom_ptr = ply_ptr->parent_rom;

	for(i=0; i<strlen(cmnd->fullstr) && i < 256; i++) {
		if(cmnd->fullstr[i] == ' ') {
			index = i + 1;
			break;
		}
	}
	cmnd->fullstr[255] = 0;
	/* Check for modem escape code */
        for(j=0; j<strlen(cmnd->fullstr) && j < 256; j++) {
                if(cmnd->fullstr[j] == '+' && cmnd->fullstr[j+1] == '+'){
                        index = -1;
                        break;
        	}
	}

	if(index == -1 || strlen(&cmnd->fullstr[index]) < 1) {
		print(fd, "Emote what?\n");
		return(0);
	}
	if(F_ISSET(ply_ptr, PSILNC)){
		print(fd, "You are unable to do that right now.\n");
		return(0);
	}
	if(!dec_daily(&ply_ptr->daily[DL_BROAE])) {
                print(fd,"You've used up all your broadcasts today.\n");                        
		return(0);
                }

	F_CLR(ply_ptr, PHIDDN);
	if(F_ISSET(ply_ptr, PLECHO)){
		ANSI(fd, CYAN);
		print(fd, "You emote: %s\n", &cmnd->fullstr[index]);
		ANSI(fd, NORMAL);
	}
	else
		print(fd, "Ok.\n");

	ANSI(fd, YELLOW);
	broadcast("### %M %s.", ply_ptr, &cmnd->fullstr[index]);
	ANSI(fd, WHITE);

	return(0);
}
/******************************************************************/
/*				classemote										  */
/******************************************************************/

/* This command allows a player to echo a message unaccompanied by */
/* any message format, except for the players name at the beginning */

int classemote(ply_ptr, cmnd)
creature	*ply_ptr;
cmd		*cmnd;
{
	room		*rom_ptr;
	int		index = -1, j, i, fd;

	fd = ply_ptr->fd;
	rom_ptr = ply_ptr->parent_rom;

	for(i=0; i<strlen(cmnd->fullstr) && i < 256; i++) {
		if(cmnd->fullstr[i] == ' ') {
			index = i + 1;
			break;
		}
	}
	cmnd->fullstr[255] = 0;
	/* Check for modem escape code */
        for(j=0; j<strlen(cmnd->fullstr) && j < 256; j++) {
                if(cmnd->fullstr[j] == '+' && cmnd->fullstr[j+1] == '+'){
                        index = -1;
                        break;
        	}
	}

	if(index == -1 || strlen(&cmnd->fullstr[index]) < 1) {
		print(fd, "Emote what?\n");
		return(0);
	}
	if(F_ISSET(ply_ptr, PSILNC)){
		print(fd, "You are unable to do that right now.\n");
		return(0);
	}
	F_CLR(ply_ptr, PHIDDN);
	if(F_ISSET(ply_ptr, PLECHO)){
		ANSI(fd, CYAN);
		print(fd, "You emote: %s\n", &cmnd->fullstr[index]);
		ANSI(fd, NORMAL);
	}
	else
		print(fd, "Ok.\n");
		broadcast_class(ply_ptr, "### %s %s.", ply_ptr->name, &cmnd->fullstr[index]);
		broadcast_eaves("--- (%s): %s %s.", class_str[ply_ptr->class], ply_ptr->name, &cmnd->fullstr[index]);
	return(0);
}

/**********************************************************************/
/*				class_send				      */
/**********************************************************************/

/* This function allows classes to send messages that only they can see. */
/* It is similar to a broadcast, but there are no limits.	     */

int class_send(ply_ptr, cmnd)
creature	*ply_ptr;
cmd			*cmnd;
{
	int	i, fd, found = 0;

	fd = ply_ptr->fd;

	for(i=0; i<strlen(cmnd->fullstr); i++) {
		if(cmnd->fullstr[i] == ' ' && cmnd->fullstr[i+1] != ' ') {
			found++;
			break;
		}
	}

	if(found < 1 || strlen(&cmnd->fullstr[i+1]) < 1) {
		print(fd, "Send what?\n");
		return(0);
	}

	print(fd, "Ok.\n");
	broadcast_class(ply_ptr, "### %s sent, \"%s\".", ply_ptr->name, &cmnd->fullstr[i+1]);
	broadcast_eaves("--- %s class sent, \"%s\".", ply_ptr->name, &cmnd->fullstr[i+1]);
	return(0);

}


int prep_herb(ply_ptr,cmnd)
creature *ply_ptr;
cmd      *cmnd;
{
  object *obj_ptr;
  long   t;

  if(ply_ptr->class != DRUID && ply_ptr->class < CARETAKER) {
		prepare(ply_ptr, cmnd);
		return(0);
  }   
  if(cmnd->num < 2)
     {
      print(ply_ptr->fd,"Prepare what herb?\n");
      return(0);
     }
   
  t = time(0);
  if(ply_ptr->lasttime[LT_PREPN].interval+ply_ptr->lasttime[LT_PREPN].ltime > t)
   {
     print(ply_ptr->fd,"You cannot prepare any more herbs right now.\n");
     return(0);
   }
   if(LT(ply_ptr,LT_ATTCK) > t)
   {
     print(ply_ptr->fd,"You cannot prepare herbs while fighting!\n");
   }

   obj_ptr = ply_ptr->ready[HELD-1];
   if(!obj_ptr)
   {
     print(ply_ptr->fd,"You aren't holding an herb.\n");
     return(0);
   }
   if(obj_ptr->type != HERB)
   {
     print(ply_ptr->fd,"%s is not an herb.\n",obj_ptr);
     return(0);
   }
   if(ply_ptr->ready[WIELD-1]) {
	print(ply_ptr->fd, "You're hands are too full to do that.\n");
	return(0);
   }
   if(obj_ptr->shotscur < 1) {
	print(ply_ptr->fd, "That herb is used up.\n");
	return(0);
   }   
   F_SET(obj_ptr, ONPREP);
   F_SET(ply_ptr, PPREPN);
   ply_ptr->lasttime[LT_PREPN].ltime = t; 

   if(F_ISSET(obj_ptr,OHBREW)) 
   {	
     print(ply_ptr->fd,"You begin to brew the %s for drinking.\n",obj_ptr);
     broadcast_rom(ply_ptr->fd,ply_ptr->rom_num,
		   "%M begins to brew a %s for drinking.",ply_ptr,obj_ptr->name);
     ply_ptr->lasttime[LT_PREPN].interval=60L;

   }
   if(F_ISSET(obj_ptr,OHNGST))
   {	
     print(ply_ptr->fd,"You begin to prepare a %s for eating.\n",obj_ptr->name);
     broadcast_rom(ply_ptr->fd,ply_ptr->rom_num,
		   "%M begins to prepare a %s for eating.",ply_ptr,obj_ptr->name);
     ply_ptr->lasttime[LT_PREPN].interval=10L;
   }
   if(F_ISSET(obj_ptr,OHAPLY))
   {	
     print(ply_ptr->fd,"You begin to soften a %s into a cream.\n",obj_ptr->name);
     broadcast_rom(ply_ptr->fd,ply_ptr->rom_num,
		   "%M begins to soften a %s into a cream.",ply_ptr,obj_ptr->name);
     ply_ptr->lasttime[LT_PREPN].interval=10L;
   }
   if(F_ISSET(obj_ptr,OHPAST))
   {	
     print(ply_ptr->fd,"You begin to mix a %s into a paste.\n",obj_ptr->name);
     broadcast_rom(ply_ptr->fd,ply_ptr->rom_num,
		   "%M begins to mix a %s into a paste.",ply_ptr,obj_ptr->name);
     ply_ptr->lasttime[LT_PREPN].interval=15L;
   }
   return(PROMPT);
}

int apply_herb(ply_ptr,cmnd)
creature *ply_ptr;
cmd      *cmnd;
{
  object *obj_ptr;
  long   t;
   
	if(cmnd->num < 2) {
		print(ply_ptr->fd, "Apply what?\n");
		return(0);
	}

  t = time(0);
  if(LT(ply_ptr,LT_PREPN) > t)
   {
     print(ply_ptr->fd,"You are still preparing the herb.\n");
     return(0);
   }
  if(LT(ply_ptr,LT_ATTCK) > t)
   {
     print(ply_ptr->fd,"You can not apply herbs in combat!\n");
     return(0);
   }

   obj_ptr = find_obj(ply_ptr,ply_ptr->first_obj,cmnd->str[1],cmnd->val[1]);
   if(!obj_ptr)
   {
     print(ply_ptr->fd,"You don't seem to have the %s.\n",cmnd->str[1]);
     return(0);
   }
   if(obj_ptr->type != HERB)
   {
     print(ply_ptr->fd,"That is not an herb.\n");
     return(0);
   }
   if(!F_ISSET(obj_ptr, ODPREP)) {
	print(ply_ptr->fd, "The %s has not been prepared properly.\n", obj_ptr->name);
	return(0);
   }
   if(!F_ISSET(obj_ptr,OHAPLY))
   {
     print(ply_ptr->fd,"You cannot apply %s.\n",obj_ptr->name);
     return(0);
   }
   print(ply_ptr->fd,"You apply the herb to your skin.\n");
   broadcast_rom(ply_ptr->fd, ply_ptr->rom_num, "%M applies some %s.", 
						ply_ptr, obj_ptr->name);
   use_herb(ply_ptr,obj_ptr,obj_ptr->special);
   return(PROMPT);
}

int ingest_herb(ply_ptr,cmnd)
creature *ply_ptr;
cmd      *cmnd;
{
  object *obj_ptr;
  long   t;
   
	if(cmnd->num < 2) {
                print(ply_ptr->fd, "Ingest what?\n");
                return(0);
        }

  t = time(0);
  if(LT(ply_ptr,LT_PREPN) > t)
   {
     print(ply_ptr->fd,"You are still preparing the herb.\n");
     return(0);
   }
 

   obj_ptr = find_obj(ply_ptr,ply_ptr->first_obj,cmnd->str[1],cmnd->val[1]);
   if(!obj_ptr)
   {
     print(ply_ptr->fd,"You don't have that.\n");
     return(0);
   }
   if(obj_ptr->type != HERB)
   {
     print(ply_ptr->fd,"That is not an herb.\n");
     return(0);
   }
   if(!F_ISSET(obj_ptr, ODPREP)) {
        print(ply_ptr->fd, "The %s has not been prepared properly.\n", obj_ptr->name);
        return(0);
   }
   if(!F_ISSET(obj_ptr,OHBREW))
   {
     print(ply_ptr->fd,"You cannot drink a %s.\n",obj_ptr->name);
     return(0);
   }
   print(ply_ptr->fd,"You drink the herb's broth.\n");
   broadcast_rom(ply_ptr->fd, ply_ptr->rom_num, "%M drinks some %s.",
                                                ply_ptr, obj_ptr->name);
   use_herb(ply_ptr,obj_ptr,obj_ptr->special);
   return(PROMPT);
}

int eat_herb(ply_ptr,cmnd)
creature *ply_ptr;
cmd      *cmnd;
{
  object *obj_ptr;
  long   t;
   
	if(cmnd->num < 2) {
                print(ply_ptr->fd, "Eat what?\n");
                return(0);
        }

  t = time(0);
  if(LT(ply_ptr,LT_PREPN) > t)
   {
     print(ply_ptr->fd,"You are still preparing the herb.\n");
     return(0);
   }
  

   obj_ptr = find_obj(ply_ptr,ply_ptr->first_obj,cmnd->str[1],cmnd->val[1]);
   if(!obj_ptr)
   {
     print(ply_ptr->fd,"You don't have that.\n");
     return(0);
   }
   if(obj_ptr->type != HERB)
   {
     print(ply_ptr->fd,"That is not an herb.\n");
     return(0);
   }
   if(!F_ISSET(obj_ptr, ODPREP)) {
        print(ply_ptr->fd, "The %s has not been prepared properly.\n", obj_ptr->name);
        return(0);
   }

   if(!F_ISSET(obj_ptr,OHNGST))
   {
     print(ply_ptr->fd,"You cannot eat a %s.\n",obj_ptr->name);
     return(0);
   }
   print(ply_ptr->fd,"You eat the herb.\n");
   broadcast_rom(ply_ptr->fd, ply_ptr->rom_num, "%M eats some %s.",
                                                ply_ptr, obj_ptr->name);
   use_herb(ply_ptr,obj_ptr,obj_ptr->special);
   return(PROMPT);
}

int paste_herb(ply_ptr,cmnd)
creature *ply_ptr;
cmd      *cmnd;
{
  object *obj_ptr;
  long   t;
   
	if(cmnd->num < 2) {
                print(ply_ptr->fd, "Paste what?\n");
                return(0);
        }

  t = time(0);
  if(LT(ply_ptr,LT_PREPN) > t)
   {
     print(ply_ptr->fd,"You are still preparing the herb.\n");
     return(0);
   }
  if(LT(ply_ptr,LT_ATTCK) > t)
   {
     print(ply_ptr->fd,"You cannot apply herbs in combat!\n");
     return(0);
   }

   obj_ptr = find_obj(ply_ptr,ply_ptr->first_obj,cmnd->str[1],cmnd->val[1]);
   if(!obj_ptr)
   {
     print(ply_ptr->fd,"You don't have that.\n");
     return(0);
   }
   if(obj_ptr->type != HERB)
   {
     print(ply_ptr->fd,"That is not an herb.\n");
     return(0);
   }
   if(!F_ISSET(obj_ptr, ODPREP)) {
        print(ply_ptr->fd, "The %s has not been prepared properly.\n", obj_ptr->name);
        return(0);
   }

   if(!F_ISSET(obj_ptr,OHPAST))
   {
     print(ply_ptr->fd,"You cannot apply a %s.\n",obj_ptr->name);
     return(0);
   }
   print(ply_ptr->fd,"You apply the herb.\n");
   broadcast_rom(ply_ptr->fd, ply_ptr->rom_num, "%M applies some %s.",
                                                ply_ptr, obj_ptr->name);
   use_herb(ply_ptr,obj_ptr,obj_ptr->special);
   return(PROMPT);
}


int use_herb(ply_ptr,obj_ptr,herb_type)
creature *ply_ptr;
object   *obj_ptr;
int      herb_type;
{
   int dmg;
   
   switch(herb_type)
     {
      case SP_HERB_HEAL:
	print(ply_ptr->fd,"A warmth flows through your body.\n");
	dmg = mdice(obj_ptr);
	del_obj_crt(obj_ptr, ply_ptr);
	free_obj(obj_ptr);
	ply_ptr->hpcur += dmg;
	if(ply_ptr->hpcur > ply_ptr->hpmax)
	  ply_ptr->hpcur = ply_ptr->hpmax;
	break;
      case SP_HERB_POISON:
	print(ply_ptr->fd,"Your blood begins to burn as the poison spreads!\n");
	F_SET(ply_ptr,PPOISN);
	dmg = mdice(obj_ptr);
	del_obj_crt(obj_ptr, ply_ptr);
	free_obj(obj_ptr);
	ply_ptr->hpcur -= dmg;
	if(ply_ptr->hpcur < 1)
	  die(ply_ptr,ply_ptr);
	break;
      case SP_HERB_HARM:
	print(ply_ptr->fd,"Your body begins to jerk maddly!\n");
	dmg = mdice(obj_ptr);
	del_obj_crt(obj_ptr, ply_ptr);
	free_obj(obj_ptr);
	ply_ptr->hpcur -= dmg;
	if(ply_ptr->hpcur < 1)
	  die(ply_ptr,ply_ptr);
	break;
      case SP_HERB_DISEASE:
	print(ply_ptr->fd,"A puss dripping rash appears on your arms and face.\n");
	F_SET(ply_ptr,PDISEA);
	break;
      case SP_HERB_CURE_POISON:
	print(ply_ptr->fd,"You feel your blood cool.\n");
	F_CLR(ply_ptr,PPOISN);
	del_obj_crt(obj_ptr, ply_ptr);
	free_obj(obj_ptr);
	break;
      case SP_HERB_CURE_DISEASE:
	print(ply_ptr->fd,"A clean feeling flows through your body.\n");
	F_CLR(ply_ptr,PDISEA);
	del_obj_crt(obj_ptr, ply_ptr);
	free_obj(obj_ptr);
	break;
      default:
        print(ply_ptr->fd,"The herb went bad.\n");
	del_obj_crt(obj_ptr, ply_ptr);
	free_obj(obj_ptr);
	break;
     }
     return(PROMPT);
   
}



/****************************************************************************
*  This function handes all attempts to eat any type object.
*
*/
int eat(ply_ptr, cmnd)
creature	*ply_ptr;
cmd		*cmnd;
{

	object 	*obj_ptr;
	int	fd;

	fd=ply_ptr->fd;

	if(cmnd->num < 2) {
		print(fd, "Eat what?\n");
		return(0);
	}

	obj_ptr=find_obj(ply_ptr, ply_ptr->first_obj, cmnd->str[1], cmnd->val[1]);
	
	if(!obj_ptr)	{
		print(fd, "You dont have that.\n");
		return(0);
	}
	switch(obj_ptr->type) {

		case HERB:
			if(F_ISSET(obj_ptr,OHBREW)) 
				ingest_herb(ply_ptr,cmnd);
			if(F_ISSET(obj_ptr,OHNGST)) 
				eat_herb(ply_ptr,cmnd);			
			break;
		case DRINK:
			if(ply_ptr->talk[5]<1) {
                                print(fd, "You can't drink anymore.\n");
                                break;
                        }
			if(obj_ptr->shotscur){
				obj_ptr->shotscur-=1;			
	                        ply_ptr->talk[5]-=obj_ptr->ndice;
        	                if(ply_ptr->talk[5] < 0)
                	                ply_ptr->talk[5]=0;
				broadcast_rom(fd, ply_ptr->rom_num, "%M drinks from a %s.", ply_ptr, obj_ptr);
                        	print(fd, "Ahh, refreshing!\n");
                        	break;
			}
			else 
				print(fd, "The %s is empty.\n", obj_ptr);
				break;
			
			
		case FOOD:
			if(ply_ptr->talk[6]<1) {
				print(fd, "You cannot eat another bite.\n");
				break;
			}
			if(obj_ptr->shotscur){
                                obj_ptr->shotscur-=1;
				ply_ptr->talk[6]-=obj_ptr->ndice;
				if(ply_ptr->talk[6] < 0)
					ply_ptr->talk[6]=0;
				if(!obj_ptr->shotscur) {			
					del_obj_crt(obj_ptr, ply_ptr);
					free(obj_ptr);	
				}
				broadcast_rom(fd, ply_ptr->rom_num, "%M munches on a %s.", ply_ptr, obj_ptr);
				print(fd, "Yummy!\n");
				break;
			}
			else
				del_obj_crt(obj_ptr, ply_ptr);
				free(obj_ptr);
				print(fd, "I don't see that here.\n");
				break;
		default:
			print(fd, "You can't do that.\n");
	}
	if(ply_ptr->talk[5]<4 && ply_ptr->talk[6]<4)
		F_CLR(ply_ptr, PNSUSN);

	return(0);
}
/****************************************************************************
*  This allows a player to set his/her description that is seen when you
* look at them.
*
*/
int describe_me(ply_ptr, cmnd)
creature	*ply_ptr;
cmd		*cmnd;
{
	int fd, i;

	fd=ply_ptr->fd;
	if(cmnd->num < 2) {
		print(fd, "Syntax: description [text|-d]\n.");
		return(0);
	}
	if(!strcmp(cmnd->str[1], "-d")) {
		print(fd, "Description cleared.\n");
		ply_ptr->description[0]=0;
		return(0);
	}
	i=0;
	while(!isspace(cmnd->fullstr[i]))
            i++;
	
	strncpy(ply_ptr->description,&cmnd->fullstr[i+1],78);
        ply_ptr->description[79]=0;
	print(fd, "Description set.\n");
	return(0);
}