/
/*
  SillyMUD Distribution V1.1b             (c) 1993 SillyMUD Developement

  See license.doc for distribution terms.   SillyMUD is based on DIKUMUD
*/

#include <stdio.h>

#include "protos.h"

#define RATIO1 1.2  /* Ratio for items that have only 1 slot */
#define RATIO2 2.2  /* Ratio for items that have 2 slots */

/* Anti-Hoarding Stuff */

int No_Hoard(struct char_data *ch, struct char_data *re,
	   struct obj_data *obj, struct obj_cost *cost) {

  char buf[MAX_INPUT_LENGTH];
  int i, misfits, flag, placed;
  long newflags;
  struct equip_fill eq;
  struct obj_data *obj2, *objbak;
  
  misfits = 0;
  i = 0;
  flag = 0;
  
  /* Initializing just to be safe */
  
  for(i=0; i<2; i++) {
    eq.head[i]=0;
    eq.body[i]=0;
    eq.arms[i]=0;
    eq.hands[i]=0;
    eq.legs[i]=0;
    eq.feet[i]=0;
    eq.waist[i]=0;
    eq.wield[i]=0;
    eq.about[i]=0;
    eq.shield[i]=0;
  }
  for(i=0; i<3; i++) {
    eq.finger[i]=0;
    eq.wrist[i]=0;
    eq.neck[i]=0;
  }
  
  obj = ch->carrying;
  
  while(obj) {
    newflags = obj->obj_flags.wear_flags;
    
    if(newflags & 1) { /* This is to strip the take out of here */
      newflags--;
    }
    if((newflags & 2) && (newflags == 2)) {
      if(!(eq.finger[0])) {
	eq.finger[0] = obj->item_number;
	eq.fingerego = GET_OBJ_EGO(obj);
      }
      else if(!(eq.finger[1])) {
	eq.finger[1] = obj->item_number;
	eq.fingerego += GET_OBJ_EGO(obj);
      }
      else if(!(eq.finger[2])) {
	eq.finger[2] = obj->item_number;
	eq.fingerego += GET_OBJ_EGO(obj);
	if(eq.fingerego > RATIO2*GET_EGO(ch))
	  return(1);
      }
      else
	return(1);  /* This bastard is a hoarding Mother F@#$er! */
    }
    else if((newflags & 4) && (newflags == 4)) {
      if(!(eq.neck[0])) {
	eq.neck[0] = obj->item_number;
	eq.neckego = GET_OBJ_EGO(obj);
      }
      else if(!(eq.neck[1])) {
	eq.neck[1] = obj->item_number;
	eq.neckego += GET_OBJ_EGO(obj);
      }
      else if(!(eq.neck[2])) {
	eq.neck[2] = obj->item_number;
	eq.neckego += GET_OBJ_EGO(obj);
	if(eq.neckego > RATIO2*GET_EGO(ch))
	  return(1);
      }
      else
	return(1);
    }
    else if((newflags & 8) && (newflags == 8)) {
      if(!(eq.body[0])) {
	eq.body[0] = obj->item_number;
	eq.bodyego = GET_OBJ_EGO(obj);
      }
      else if(!(eq.body[1])) {
	eq.body[1] = obj->item_number;
	eq.bodyego += GET_OBJ_EGO(obj);
	if(eq.bodyego > RATIO1*GET_EGO(ch))
	  return(1);
      }
      else
	return(1);
    }
    else if((newflags & 16) && (newflags == 16)) {
      if(!(eq.head[0])) {
	eq.head[0] = obj->item_number;
	eq.headego = GET_OBJ_EGO(obj);
      }
      else if(!(eq.head[1])) {
	eq.head[1] = obj->item_number;
	eq.headego += GET_OBJ_EGO(obj);
	if(eq.headego > RATIO1*GET_EGO(ch))
	  return(1);
      }
      else
	return(1);
    }
    else if((newflags & 32) && (newflags == 32)) {
      if(!(eq.legs[0])) {
	eq.legs[0] = obj->item_number;
	eq.legsego = GET_OBJ_EGO(obj);
      }
      else if(!(eq.legs[1])) {
	eq.legs[1] = obj->item_number;
	eq.legsego += GET_OBJ_EGO(obj);
	if(eq.legsego > RATIO1*GET_EGO(ch))
	  return(1);
      }
      else
	return(1);
    }
    else if((newflags & 64) && (newflags == 64)) {
      if(!(eq.feet[0])) {
	eq.feet[0] = obj->item_number;
	eq.feetego = GET_OBJ_EGO(obj);
      }
      else if(!(eq.feet[1])) {
	eq.feet[1] = obj->item_number;
	eq.feetego += GET_OBJ_EGO(obj);
	if(eq.feetego > RATIO1*GET_EGO(ch))
	  return(1);
      }
      else
	return(1);
    }
    else if((newflags & 128) && (newflags == 128)) {
      if(!(eq.hands[0])) {
	eq.hands[0] = obj->item_number;
	eq.handsego = GET_OBJ_EGO(obj);
      }
      else if(!(eq.hands[1])) {
	eq.hands[1] = obj->item_number;
	eq.handsego += GET_OBJ_EGO(obj);
	if(eq.handsego > RATIO1*GET_EGO(ch))
	  return(1);
      }
      else
	return(1);
    }
    else if((newflags & 256) && (newflags == 256)) {
      if(!(eq.arms[0])) {
	eq.arms[0] = obj->item_number;
	eq.armsego = GET_OBJ_EGO(obj);
      }
      else if(!(eq.arms[1])) {
	eq.arms[1] = obj->item_number;
	eq.armsego += GET_OBJ_EGO(obj);
	if(eq.armsego > RATIO1*GET_EGO(ch))
	  return(1);
      }
      else
	return(1);
    }
    else if((newflags & 512) && (newflags == 512)) {
      if(!(eq.shield[0])) {
	eq.shield[0] = obj->item_number;
	eq.shieldego = GET_OBJ_EGO(obj);
      }
      else if(!(eq.shield[1])) {
	eq.shield[1] = obj->item_number;
	eq.shieldego += GET_OBJ_EGO(obj);
	if(eq.shieldego > RATIO1*GET_EGO(ch))
	  return(1);
      }
      else
	return(1);
    }
    else if((newflags & 1024) && (newflags == 1024)) {
      if(!(eq.about[0])) {
	eq.about[0] = obj->item_number;
	eq.aboutego = GET_OBJ_EGO(obj);
      }
      else if(!(eq.about[1])) {
	eq.about[1] = obj->item_number;
	eq.aboutego += GET_OBJ_EGO(obj);
	if(eq.aboutego > RATIO1*GET_EGO(ch))
	  return(1);
      }
      else
	return(1);
    }
    else if((newflags & 2048) && (newflags == 2048)) {
      if(!(eq.waist[0])) {
	eq.waist[0] = obj->item_number;
	eq.waistego = GET_OBJ_EGO(obj);
      }
      else if(!(eq.waist[1])) {
	eq.waist[1] = obj->item_number;
	eq.waistego += GET_OBJ_EGO(obj);
	if(eq.waistego > RATIO1*GET_EGO(ch))
	  return(1);
      }
      else
	return(1);
    }
    else if((newflags & 4096) && (newflags == 4096)) {
      if(!(eq.wrist[0])) {
	eq.wrist[0] = obj->item_number;
	eq.wristego = GET_OBJ_EGO(obj);
      }
      else if(!(eq.wrist[1])) {
	eq.wrist[1] = obj->item_number;
	eq.wristego += GET_OBJ_EGO(obj);
      }
      else if(!(eq.wrist[2])) {
	eq.wrist[2] = obj->item_number;
	eq.wristego += GET_OBJ_EGO(obj);
	if(eq.wristego > RATIO2*GET_EGO(ch))
	  return(1);
      }
      else
	return(1);
    }
    else if((newflags & 8192) && (newflags == 8192)) {
      if(!(eq.wield[0])) {
	eq.wield[0] = obj->item_number;
	eq.wieldego = GET_OBJ_EGO(obj);
      }
      else if(!(eq.wield[1])) {
	eq.wield[1] = obj->item_number;
	eq.wieldego += GET_OBJ_EGO(obj);
	   if(eq.wieldego > RATIO1*GET_EGO(ch))
	     return(1);
      }
      else
	return(1);
    }
    else if(newflags == 0);       /* This will clear up TAKE */
    else if(newflags == 16384);   /* This will clear up TAKE, HOLD's */
    else {
      eq.misfit[misfits] = obj->obj_flags.wear_flags;
      eq.misfitego[misfits++] = GET_OBJ_EGO(obj);
    }
    
    if((obj->obj_flags.type_flag == 15) && (flag == 0)) {
      objbak = obj;
      obj = obj->contains;
      flag = 1;
    }
    else if((obj->obj_flags.type_flag == 15) && (flag == 1)) {
      obj2 = obj;
      obj = obj->contains;
      flag = 2;
    }
    else if((obj->obj_flags.type_flag == 15) && (flag == 2)) {
      return(1);  /* Anyone burying shit in bags within bags is a hoarder by my book! */
    }
    else if(!(obj->next_content)) {
      if(flag == 2) {
	obj = obj2->next_content;
	obj2 = 0;
	flag = 1;
      }
      else if(flag == 1) {
	obj = objbak->next_content;
	objbak = 0;
	flag = 0;
      }
      else if(flag == 0) {
	obj = obj->next_content;  /* This won't pass the while.. We're Done */
      }
    }
    else {
      obj = obj->next_content;
    }
  }
  
  for(i=0; i<MAX_WEAR; i++) {
    obj = ch->equipment[i];
    while(obj) {
      newflags = obj->obj_flags.wear_flags;
      
      if(newflags & 1) { /* This is to strip the take out of here */
	newflags--;
      }
      if((newflags & 2) && (newflags == 2)) {
	if(!(eq.finger[0])) {
	  eq.finger[0] = obj->item_number;
	  eq.fingerego = GET_OBJ_EGO(obj);
	}
	else if(!(eq.finger[1])) {
	  eq.finger[1] = obj->item_number;
	  eq.fingerego += GET_OBJ_EGO(obj);
	}
	else if(!(eq.finger[2])) {
	  eq.finger[2] = obj->item_number;
	  eq.fingerego += GET_OBJ_EGO(obj);
	  if(eq.fingerego > RATIO2*GET_EGO(ch))
	    return(1);
	}
	else
	  return(1);  /* This bastard is a hoarding Mother F@#$er! */
      }
      else if((newflags & 4) && (newflags == 4)) {
	if(!(eq.neck[0])) {
	  eq.neck[0] = obj->item_number;
	  eq.neckego = GET_OBJ_EGO(obj);
	}
	else if(!(eq.neck[1])) {
	  eq.neck[1] = obj->item_number;
	  eq.neckego += GET_OBJ_EGO(obj);
	}
	else if(!(eq.neck[2])) {
	  eq.neck[2] = obj->item_number;
	  eq.neckego += GET_OBJ_EGO(obj);
	  if(eq.neckego > RATIO2*GET_EGO(ch))
	    return(1);
	}
	else
	  return(1);
      }
      else if((newflags & 8) && (newflags == 8)) {
	if(!(eq.body[0])) {
	  eq.body[0] = obj->item_number;
	  eq.bodyego = GET_OBJ_EGO(obj);
	}
	else if(!(eq.body[1])) {
	  eq.body[1] = obj->item_number;
	  eq.bodyego += GET_OBJ_EGO(obj);
	  if(eq.bodyego > RATIO1*GET_EGO(ch))
	    return(1);
	}
	else
	  return(1);
      }
      else if((newflags & 16) && (newflags == 16)) {
	if(!(eq.head[0])) {
	  eq.head[0] = obj->item_number;
	  eq.headego = GET_OBJ_EGO(obj);
	}
	else if(!(eq.head[1])) {
	  eq.head[1] = obj->item_number;
	  eq.headego += GET_OBJ_EGO(obj);
	  if(eq.headego > RATIO1*GET_EGO(ch))
	    return(1);
	}
	else
	  return(1);
      }
      else if((newflags & 32) && (newflags == 32)) {
	if(!(eq.legs[0])) {
	  eq.legs[0] = obj->item_number;
	  eq.legsego = GET_OBJ_EGO(obj);
	}
	else if(!(eq.legs[1])) {
	  eq.legs[1] = obj->item_number;
	  eq.legsego += GET_OBJ_EGO(obj);
	  if(eq.legsego > RATIO1*GET_EGO(ch))
	    return(1);
	}
	else
	  return(1);
      }
      else if((newflags & 64) && (newflags == 64)) {
	if(!(eq.feet[0])) {
	  eq.feet[0] = obj->item_number;
	  eq.feetego = GET_OBJ_EGO(obj);
	}
	else if(!(eq.feet[1])) {
	  eq.feet[1] = obj->item_number;
	  eq.feetego += GET_OBJ_EGO(obj);
	  if(eq.feetego > RATIO1*GET_EGO(ch))
	    return(1);
	}
	else
	  return(1);
      }
      else if((newflags & 128) && (newflags == 128)) {
	if(!(eq.hands[0])) {
	  eq.hands[0] = obj->item_number;
	  eq.handsego = GET_OBJ_EGO(obj);
	}
	else if(!(eq.hands[1])) {
	  eq.hands[1] = obj->item_number;
	  eq.handsego += GET_OBJ_EGO(obj);
	  if(eq.handsego > RATIO1*GET_EGO(ch))
	    return(1);
	}
	else
	  return(1);
      }
      else if((newflags & 256) && (newflags == 256)) {
	if(!(eq.arms[0])) {
	  eq.arms[0] = obj->item_number;
	  eq.armsego = GET_OBJ_EGO(obj);
	}
	else if(!(eq.arms[1])) {
	  eq.arms[1] = obj->item_number;
	  eq.armsego += GET_OBJ_EGO(obj);
	  if(eq.armsego > RATIO1*GET_EGO(ch))
	    return(1);
	}
	else
	  return(1);
      }
      else if((newflags & 512) && (newflags == 512)) {
	if(!(eq.shield[0])) {
	  eq.shield[0] = obj->item_number;
	  eq.shieldego = GET_OBJ_EGO(obj);
	}
	else if(!(eq.shield[1])) {
	  eq.shield[1] = obj->item_number;
	  eq.shieldego += GET_OBJ_EGO(obj);
	  if(eq.shieldego > RATIO1*GET_EGO(ch))
	    return(1);
	}
	else
	  return(1);
      }
      else if((newflags & 1024) && (newflags == 1024)) {
	if(!(eq.about[0])) {
	  eq.about[0] = obj->item_number;
	  eq.aboutego = GET_OBJ_EGO(obj);
	}
	else if(!(eq.about[1])) {
	  eq.about[1] = obj->item_number;
	  eq.aboutego += GET_OBJ_EGO(obj);
	  if(eq.aboutego > RATIO1*GET_EGO(ch))
	    return(1);
	}
	else
	  return(1);
      }
      else if((newflags & 2048) && (newflags == 2048)) {
	if(!(eq.waist[0])) {
	  eq.waist[0] = obj->item_number;
	  eq.waistego = GET_OBJ_EGO(obj);
	}
	else if(!(eq.waist[1])) {
	  eq.waist[1] = obj->item_number;
	  eq.waistego += GET_OBJ_EGO(obj);
	  if(eq.waistego > RATIO1*GET_EGO(ch))
	    return(1);
	}
	else
	  return(1);
      }
      else if((newflags & 4096) && (newflags == 4096)) {
	if(!(eq.wrist[0])) {
	  eq.wrist[0] = obj->item_number;
	  eq.wristego = GET_OBJ_EGO(obj);
	}
	else if(!(eq.wrist[1])) {
	  eq.wrist[1] = obj->item_number;
	  eq.wristego += GET_OBJ_EGO(obj);
	}
	else if(!(eq.wrist[2])) {
	  eq.wrist[2] = obj->item_number;
	  eq.wristego += GET_OBJ_EGO(obj);
	  if(eq.wristego > RATIO2*GET_EGO(ch))
	    return(1);
	}
	else
	  return(1);
      }
      else if((newflags & 8192) && (newflags == 8192)) {
	if(!(eq.wield[0])) {
	  eq.wield[0] = obj->item_number;
	  eq.wieldego = GET_OBJ_EGO(obj);
	}
	else if(!(eq.wield[1])) {
	  eq.wield[1] = obj->item_number;
	  eq.wieldego += GET_OBJ_EGO(obj);
	  if(eq.wieldego > RATIO1*GET_EGO(ch))
	    return(1);
	}
	else
	  return(1);
      }
      else if(newflags == 0);
      else if(newflags == 16384);
      else {
	eq.misfit[misfits] = obj->obj_flags.wear_flags;
	eq.misfitego[misfits++] = GET_OBJ_EGO(obj);
      }
      
      if((obj->obj_flags.type_flag == 15) && (flag == 0)) {
	objbak = obj;
	obj = obj->contains;
	flag = 1;
      }
      else if((obj->obj_flags.type_flag == 15) && (flag == 1)) {
	obj2 = obj;
	obj = obj->contains;
	flag = 2;
      }
      else if((obj->obj_flags.type_flag == 15) && (flag == 2)) {
	return(1);  /* Anyone burying shit in bags within bags is a hoarder by my book! */
      }
      else if(!(obj->next_content)) {
	if(flag == 2) {
	  obj = obj2->next_content;
	  obj2 = 0;
	  flag = 1;
	}
	else if(flag == 1) {
	  obj = objbak->next_content;
	  objbak = 0;
	  flag = 0;
	}
	else if(flag == 0) {
	  obj = obj->next_content; /* This won't pass the while.. We're Done */
	}
      }
      else {
	obj = obj->next_content;
      }
    }
  }
  placed = 0;
  
  for(i=0; i<misfits; i++) {   /* Now to see if the multi-wears fit anywhere */
    
    newflags = eq.misfit[i];
    
    if((newflags & 2) && !(placed)) {
      if(!(eq.finger[0])) {
	eq.finger[0] = eq.misfit[i];
	eq.fingerego = eq.misfitego[i];
	placed = 1;
      }
      else if(!(eq.finger[1])) {
	eq.finger[1] = eq.misfit[i];
	eq.fingerego += eq.misfitego[i];
	placed = 1;
      }
      else if(!(eq.finger[2])) {
	eq.finger[2] = eq.misfit[i];
	eq.fingerego += eq.misfitego[i];
	placed = 1;
	if(eq.fingerego > RATIO2*GET_EGO(ch))
	  return(1);
      }
    }
    if((newflags & 4) && !(placed)) {
      if(!(eq.neck[0])) {
	eq.neck[0] = eq.misfit[i];
	eq.neckego = eq.misfitego[i];
	placed = 1;
      }
      else if(!(eq.neck[1])) {
	eq.neck[1] = eq.misfit[i];
	eq.neckego += eq.misfitego[i];
	placed = 1;
      }
      else if(!(eq.neck[2])) {
	eq.neck[2] = eq.misfit[i];
	eq.neckego += eq.misfitego[i];
	placed = 1;
	if(eq.neckego > RATIO2*GET_EGO(ch))
	  return(1);
      }
    }
    if((newflags & 8) && !(placed)) {
      if(!(eq.body[0])) {
	eq.body[0] = eq.misfit[i];
	eq.bodyego = eq.misfitego[i];
	placed = 1;
      }
      else if(!(eq.body[1])) {
	eq.body[1] = eq.misfit[i];
	eq.bodyego += eq.misfitego[i];
	placed = 1;
	if(eq.bodyego > RATIO1*GET_EGO(ch))
	  return(1);
      }
    }
    if((newflags & 16) && !(placed)) {
      if(!(eq.head[0])) {
	eq.head[0] = eq.misfit[i];
	eq.headego = eq.misfitego[i];
	placed = 1;
      }
      else if(!(eq.head[1])) {
	eq.head[1] = eq.misfit[i];
	eq.headego += eq.misfitego[i];
	placed = 1;
	if(eq.headego > RATIO1*GET_EGO(ch))
	  return(1);
      }
    }
    if((newflags & 32) && !(placed)) {
      if(!(eq.legs[0])) {
	eq.legs[0] = eq.misfit[i];
	eq.legsego = eq.misfitego[i];
	placed = 1;
      }
      else if(!(eq.legs[1])) {
	eq.legs[1] = eq.misfit[i];
	eq.legsego += eq.misfitego[i];
	placed = 1;
	if(eq.legsego > RATIO1*GET_EGO(ch))
	  return(1);
      }
    }
    if((newflags & 64) && !(placed)) {
      if(!(eq.feet[0])) {
	eq.feet[0] = eq.misfit[i];
	eq.feetego = eq.misfitego[i];
	placed = 1;
      }
      else if(!(eq.feet[1])) {
	eq.feet[1] = eq.misfit[i];
	eq.feetego += eq.misfitego[i];
	placed = 1;
	if(eq.feetego > RATIO1*GET_EGO(ch))
	  return(1);
      }
    }
    if((newflags & 128) && !(placed)) {
      if(!(eq.hands[0])) {
	eq.hands[0] = eq.misfit[i];
	eq.handsego = eq.misfitego[i];
	placed = 1;
      }
      else if(!(eq.hands[1])) {
	eq.hands[1] = eq.misfit[i];
	eq.handsego += eq.misfitego[i];
	placed = 1;
	if(eq.handsego > RATIO1*GET_EGO(ch))
	  return(1);
      }
    }
    if((newflags & 256) && !(placed)) {
      if(!(eq.arms[0])) {
	eq.arms[0] = eq.misfit[i];
	eq.armsego = eq.misfitego[i];
	placed = 1;
      }
      else if(!(eq.arms[1])) {
	eq.arms[1] = eq.misfit[i];
	eq.armsego += eq.misfitego[i];
	placed = 1;
	if(eq.armsego > RATIO1*GET_EGO(ch))
	  return(1);
      }
    }
    if((newflags & 512) && !(placed)) {
      if(!(eq.shield[0])) {
	eq.shield[0] = eq.misfit[i];
	eq.shieldego = eq.misfitego[i];
	placed = 1;
      }
      else if(!(eq.shield[1])) {
	eq.shield[1] = eq.misfit[i];
	eq.shieldego += eq.misfitego[i];
	placed = 1;
	if(eq.shieldego > RATIO1*GET_EGO(ch))
	  return(1);
      }
    }
    if((newflags & 1024) && !(placed)) {
      if(!(eq.about[0])) {
	eq.about[0] = eq.misfit[i];
	eq.aboutego = eq.misfitego[i];
	placed = 1;
      }
      else if(!(eq.about[1])) {
	eq.about[1] = eq.misfit[i];
	eq.aboutego += eq.misfitego[i];
	placed = 1;
	if(eq.aboutego > RATIO1*GET_EGO(ch))
	  return(1);
      }
    }
    if((newflags & 2048) && !(placed)) {
      if(!(eq.waist[0])) {
	eq.waist[0] = eq.misfit[i];
	eq.waistego = eq.misfitego[i];
	placed = 1;
      }
      else if(!(eq.waist[1])) {
	eq.waist[1] = eq.misfit[i];
	eq.waistego += eq.misfitego[i];
	placed = 1;
	if(eq.waistego > RATIO1*GET_EGO(ch))
	  return(1);
      }
    }
    if((newflags & 4096) && !(placed)) {
      if(!(eq.wrist[0])) {
	eq.wrist[0] = eq.misfit[i];
	eq.wristego = eq.misfitego[i];
	placed = 1;
      }
      else if(!(eq.wrist[1])) {
	eq.wrist[1] = eq.misfit[i];
	eq.wristego += eq.misfitego[i];
	placed = 1;
      }
      else if(!(eq.wrist[2])) {
	eq.wrist[2] = eq.misfit[i];
	eq.wristego += eq.misfitego[i];
	placed = 1;
	if(eq.wristego > RATIO2*GET_EGO(ch))
	  return(1);
      }
    }
    if((newflags & 8192) && !(placed)) {
      if(!(eq.wield[0])) {
	eq.wield[0] = eq.misfit[i];
	eq.wieldego = eq.misfitego[i];
	placed = 1;
      }
      else if(!(eq.wield[1])) {
	eq.wield[1] = eq.misfit[i];
	eq.wieldego += eq.misfitego[i];
	placed = 1;
	if(eq.wieldego > RATIO1*GET_EGO(ch))
	  return(1);
      }
    }
    if(!(placed)) {
      return(1);
    }
  }
  
  return(0);  /* Passed the checks */
}