wolfpaw4.0-release/area/
wolfpaw4.0-release/backup/
wolfpaw4.0-release/bin/
wolfpaw4.0-release/boards/
wolfpaw4.0-release/clans/
wolfpaw4.0-release/councils/
wolfpaw4.0-release/deity/
wolfpaw4.0-release/finger/
wolfpaw4.0-release/gods/
wolfpaw4.0-release/guilds/
wolfpaw4.0-release/lockers/
wolfpaw4.0-release/log/
wolfpaw4.0-release/log/Clean/
wolfpaw4.0-release/maps/
wolfpaw4.0-release/offline_data/
wolfpaw4.0-release/player-obj/
wolfpaw4.0-release/player-obj/a/
wolfpaw4.0-release/player/
wolfpaw4.0-release/player/a/
wolfpaw4.0-release/plog/
wolfpaw4.0-release/save-rooms/
wolfpaw4.0-release/secure/
wolfpaw4.0-release/source/
wolfpaw4.0-release/source/betasrc/system/
wolfpaw4.0-release/source/betasrc/util/
wolfpaw4.0-release/system/clean-source/
wolfpaw4.0-release/system/clean-source/grux/
/*--------------------------------------------------------------------------*
 *                         ** WolfPaw 1.0 **                                *
 *--------------------------------------------------------------------------*
 *               WolfPaw 1.0 (c) 1997,1998 by Dale Corse                    *
 *--------------------------------------------------------------------------*
 *            The WolfPaw Coding Team is headed by: Greywolf                *
 *  With the Assitance from: Callinon, Dhamon, Sentra, Wyverns, Altrag      *
 *  Scryn, Thoric, Justice, Tricops and Mask.                               *
 *--------------------------------------------------------------------------*
 *		Equipment Hoarders Handling Module			    *
 *--------------------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include "mud.h"

/*
 * How many Items a Char can Carry before they are legal
 */
#define HOARDER_NUMBER		10

/* Prototypes */
void hoard_handler(CHAR_DATA *ch, OBJ_DATA *obj, int type );
void hoarder_check(CHAR_DATA *ch, OBJ_DATA *obj, int type );
int get_num_objs_char( CHAR_DATA *ch );

/*
 * Check the char, see if they are Hoarding. --GW
 */
void hoarder_check(CHAR_DATA *ch, OBJ_DATA *obj,  int type )
{
/* No Mobs! */
if ( IS_NPC(ch) )
return;

/* Gods are allowed */
if ( IS_IMMORTAL(ch) )
return;

/* No Char for some Reason? (Oinvoke?) */
if ( !ch )
return;

switch( type )
{
case  HCHECK_LOGIN:   /* Logging On? */
  if ( get_num_objs_char(ch) > HOARDER_NUMBER )
  {
      hoard_handler(ch,NULL,HOARD_SEND_TO_VOID);
      break;
  }
  break; /* Not a Hoarder */

case HCHECK_DROP:  /* Dropped an Object */
  if ( ch->pcdata->hoard_status == HOARD_IN_VOID )
  {
     hoard_handler(ch,obj,HOARD_DROP_TRIGGER);
     break;    
  }
  break; /* Sorting, dont destroy it */

case HCHECK_MOVE:  /* They Moved..? */
  /* Send Another Explanation when they go North */
  if ( ch->pcdata->hoard_status == HOARD_IN_VOID )
  {
    hoard_handler(ch,NULL,HOARD_SORTING_EQ);
    break;
  }
  else /* Were Done, put us back in the Hoarder's Void */
  {
    hoard_handler(ch,NULL,HOARD_DONE_SORTING);
    break;
  }

case HCHECK_AUCTION: /* Hoarder Auctioned an Item */
     hoard_handler(ch,obj,HOARD_AUCD_ITEM);
     break;

default:
    bug("Hoarder_Check: BAD TYPE!",0); /* Uh oh! */
    break;    
}

return;
}

/*
 * Main Interface... does it all! --GW
 */
void hoard_handler(CHAR_DATA *ch, OBJ_DATA *obj, int type )
{
int cnt=0;
char buf[MSL];

cnt = get_num_objs_char(ch);

switch( type )
{
 case HOARD_SEND_TO_VOID: /* Put a Char in the Void */
    log_string("Hoader's Void Activated:");
    sprintf(buf,"Sending %s to the Hoarder's Void with %d Limited Objects!",capitalize(ch->name),cnt);
    log_string(buf);
    act(AT_RED,"A Large hole opens in the ground! When the dust clears, $n is gone!",ch,NULL,NULL,TO_ROOM);
    char_from_room(ch);
    char_to_room(ch,get_room_index(ROOM_VNUM_HOARDERS_VOID,1));
    act(AT_RED,"$n falls in from above, and lands on $s ass.",ch,NULL,NULL,TO_ROOM);
    send_to_char("/a&RNOTICE:&W You have Been automatically sent to the Hoarder's Void.\n\r",ch);
    ch_printf(ch,"           &W You may not leave untill you have less then %d LIMITED\n\r",HOARDER_NUMBER);
    send_to_char("           &W objects in your inventory, or in containers. Anything\n\r",ch);
    send_to_char("           &W you drop in the Hoarder's Void will be &RDESTROYED&W.\n\r",ch);
    send_to_char("           &W you may proceed &RNORTH&W to sort equipment, in the&W\n\r",ch);
    send_to_char("           &W room &RNORTH&W objects dropped will &RNOT&W be destroyed\n\r",ch);
    send_to_char("           &W Please Sort your Eq there, and drop it in this room.\n\r",ch);
    send_to_char("           &W &RYou will be automatically removed from this void once\n\r",ch);
    ch_printf(ch,"           &W you have less then %d Limited Objects&W.\n\r",HOARDER_NUMBER);
    ch->pcdata->hoard_status = HOARD_IN_VOID;
    SET_BIT(ch->pcdata->flagstwo, MOREPC_HOARDER);
    break;

case HOARD_DROP_TRIGGER: /* They Dropped it .. Destroy it, let them out if done */
    act(AT_RED,"$p sinks into the abyss, lost forever.",ch,obj,NULL,TO_CHAR);
    act(AT_RED,"$p sinks into the abyss, lost forever.",ch,obj,NULL,TO_ROOM);
    separate_obj(obj);
    obj_from_room(obj);
    extract_obj(obj);
    cnt = get_num_objs_char(ch);
    if ( cnt <= HOARDER_NUMBER ) /* Let em Go */
    {
    send_to_char("You are no longer a Hoarder. The Void has Released you.\n\r",ch);
    act(AT_YELLOW,"$n is surrounded in a Godly light, and vanishes!",ch,NULL,NULL,TO_ROOM); 
    char_from_room(ch);
    char_to_room(ch,get_room_index(ROOM_VNUM_TEMPLE,1));
    act(AT_YELLOW,"$n appears in a flash of Godly Light!",ch,NULL,NULL,TO_ROOM);
    sprintf(buf,"Hoarder's Void Releasing: %s",capitalize(ch->name));
    log_string(buf);
    ch->pcdata->hoard_status = HOARD_NONE;
    REMOVE_BIT(ch->pcdata->flagstwo, MOREPC_HOARDER);
    break;
    }
    sprintf(buf,"A Raspy Voice Echos '$n, you are now carrying %d Limited Objects.",cnt);
    act(AT_MAGIC,buf,ch,NULL,NULL,TO_CHAR);
    act(AT_MAGIC,buf,ch,NULL,NULL,TO_ROOM);
    break;

case HOARD_SORTING_EQ:   /* Let them out to sort eq */
    send_to_char("&WYou May sort Eq, and Drop it in this room, it will &RNOT&W be Destroyed here.\n\r",ch);
    send_to_char("&WProceed South when you are ready to continue.\n\r",ch);
    ch->pcdata->hoard_status = HOARD_SORTING_EQ;
    break;

case HOARD_DONE_SORTING: /* Done Sorting, put em back */
    send_to_char("&WYou proceed back to the Hoarder's Void.\n\r",ch);
    send_to_char("&WAnything you drop here &RWILL&W be &RDESTROYED&W\n\r",ch);
    ch->pcdata->hoard_status = HOARD_IN_VOID;
    break;

case HOARD_AUCD_ITEM: /* Hoarder Auctioned an Item */
    if ( !IS_LIMITED(obj) )
       break;

    cnt = get_num_objs_char(ch);
    if ( cnt <= HOARDER_NUMBER ) /* Let em Go */
    {
    send_to_char("You are no longer a Hoarder. The Void has Released you.\n\r",ch);
    act(AT_YELLOW,"$n is surrounded in a Godly light, and vanishes!",ch,NULL,NULL,TO_ROOM); 
    char_from_room(ch);
    char_to_room(ch,get_room_index(ROOM_VNUM_TEMPLE,1));
    act(AT_YELLOW,"$n appears in a flash of Godly Light!",ch,NULL,NULL,TO_ROOM);
    sprintf(buf,"Hoarder's Void Releasing: %s",capitalize(ch->name));
    log_string(buf);
    ch->pcdata->hoard_status = HOARD_NONE;
    REMOVE_BIT(ch->pcdata->flagstwo, MOREPC_HOARDER);
    break;
    }
    sprintf(buf,"A Raspy Voice Echos '$n, you are now carrying %d Limited Objects.",cnt);
    act(AT_MAGIC,buf,ch,NULL,NULL,TO_CHAR);
    act(AT_MAGIC,buf,ch,NULL,NULL,TO_ROOM);
    break;

default:
   bug("Hoard_Handler: BAD TYPE!",0);
   break;
}

return;
}

/*
 * Find out How many Items a Character is Carrying --GW 
 */
int get_num_objs_char( CHAR_DATA *ch )
{
OBJ_DATA *obj, *next_obj, *container, *container_next;
int cnt=0;

/* Check Inventory */
for ( obj=ch->first_carrying; obj; obj = next_obj )
{
  next_obj = obj->next_content;
  if ( IS_LIMITED(obj) && obj->wear_loc == WEAR_NONE )
  {
    if ( obj->count > 1 )
      cnt += obj->count;
    else
      cnt++;
  }
}

/* Check for WORN Containers -- opps all containers */
for ( obj=ch->first_carrying; obj; obj = next_obj )
{
  next_obj = obj->next_content;
     if ( obj->item_type == ITEM_CONTAINER )
  {
     for ( container=obj->first_content; container; container = container_next )
     {
         container_next = container->next_content;
        
         if ( IS_LIMITED(container) )
	 {
          if ( container->count > 1 )
           cnt += container->count;
          else
           cnt++;
	 }
     }
  }
}

return cnt;
}