/
mudd/docs/html/
mudd/world/
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "mud.h"

void 
allocate_correct_datatype (SINGLE_OBJECT * obj, int *val)
{
  OBJ_PROTOTYPE *oi = obj->pIndexData;

  if (oi == NULL)
    {
      fprintf (stderr, "Error with null prototype in allocating object datatype.\n");
      exit (99);
    }
  switch (oi->item_type)
    {
    case ITEM_ARMOR:
      {
	I_ARMOR *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->warmth = val[9];
	data->protects_legs = val[0];
	data->protects_body = val[1];
	data->protects_head = val[2];
	data->protects_arms = val[3];
	data->max_condition = val[6];
	data->condition_now = val[7];
	obj->more = data;
	break;
      }
    case ITEM_RAW:
      {
	I_RAW *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->type = val[0];
	data->rank = val[1];
	obj->more = data;
	break;
      }
    case ITEM_SIEGE:
      {
	I_SIEGE * data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->type = val[0];
	data->flags = val[1];
	data->ammo_type = val[2];
	data->firing_time = val[3];
	data->range = val[4];
	data->hps = val[5];
	data->max_hps = val[6];
	obj->more = data;
	break;
      }
    case ITEM_WEAPON:
      {
	I_WEAPON *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->firstdice = val[7];
	data->seconddice = val[8];
	data->attack_type = val[3];
	data->casts_spell = val[5];
	data->damage_p = (val[0] == 0 ? 100 : val[0]);
	data->strength = val[1];
	obj->more = data;
	break;
      }
    
    case ITEM_MISSILE:
      {
	I_MISSILE *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->damage_p = (val[0] == 0 ? 100 : val[0]);
	data->strength = val[1];
        data->aiming_time = val[2];
        data->shots_per_use = val[3];
        data->ammo_type = val[4];  
	data->range = val[5];
	obj->more = data;
	break;
      }
    
    case ITEM_DRINK_CON:
      {
	I_DRINK *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->max_liquid = val[1];
	data->liquid_now = val[0];
	data->liquid_type = val[2];
	data->not_poison = val[3];
	obj->more = data;
	break;
      }
    case ITEM_FOOD:
      {
	I_FOOD *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->hours = val[0];
	data->not_poison = val[3];
	obj->more = data;
	break;
      }
    case ITEM_AMMO:
      {
	I_AMMO *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->firstdice = val[7];
	data->seconddice = val[8];
        data->shots_left = val[1];
        data->total_shots = val[1];
	data->ammo_type = val[4];
	obj->more = data;
	break;
      }
    case ITEM_LIGHT:
      {
	I_LIGHT *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->light_fillable = val[2];
	data->light_lit = val[3];
	data->light_now = val[0];
	data->max_light = val[1];
	obj->more = data;
	break;
      }
    case ITEM_TRAP:
      {
	I_TRAP *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->location = val[0];
	data->type = val[1];
	obj->more = data;
	break;
      }
    case ITEM_SHIELD:
      {
	I_SHIELD *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
        data->current_power = val[0];
        data->max_power = val[1];
	obj->more = data;
	break;
      }
    case ITEM_TOOL:
      {
	I_TOOL *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->tool_type = val[0];
	data->uses = val[1];
	data->max_uses = val[2];
	obj->more = data;
	break;
      }
    case ITEM_VEHICLE:
      {
	I_VEHICLE *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->sector_use = val[0];
	obj->more = data;
	break;
      }
    case ITEM_FOUNTAIN:
      {
	I_FOUNTAIN *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->liquid = val[0];
	data->spells[0] = val[1];
	data->spells[1] = val[2];
	data->spells[2] = val[3];
	obj->more = data;
	break;
      }
    case ITEM_POTION:
    case ITEM_PILL:
    case ITEM_SCROLL:
      {
	I_POTION *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->spell_level = val[0];
	data->spells[0] = val[1];
	data->spells[1] = val[2];
	data->spells[2] = val[3];
	obj->more = data;
	break;
      }
    case ITEM_GEM:
      {
	I_GEM *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->gem_type = val[0];
	data->mana_now = val[1];
	data->max_mana = val[2];
	data->max_level = val[3];
 	data->casts_spell = val[5];
	obj->more = data;
	break;
      }
    case ITEM_WAND:
    case ITEM_STAFF:
      {
	I_WAND *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->spell_level = val[0];
	data->max_charges = val[1];
	data->current_charges = val[2];
	data->spells[0] = val[3];
	data->spells[1] = val[4];
	data->spells[2] = val[5];
	obj->more = data;
	break;
      }
    case ITEM_FURNITURE:
      {
	I_FURNITURE *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->to_room_vnum = val[1];
	data->type = val[0];
	data->gametype = val[3];
        data->portal_flags = val[5];
	obj->more = data;
	break;
      }
    case ITEM_CONTAINER:
    case ITEM_CORPSE_PC:
    case ITEM_CORPSE_NPC:
      {
	I_CONTAINER *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->max_weight = val[0];
	data->flags = val[1];
	data->key_vnum = val[2];
	data->money = val[8];
	data->reason_for_death[0] = '\0';
	data->looted_by[0] = '\0';
	data->looted_by_two[0] = '\0';
	if (number_range(1,6) == 3 && 
	    IS_SET(data->flags, CONT_LOCKED) &&
	    IS_SET(data->flags, CONT_CLOSED) &&
	    val[3] == 0)
	  data->trap_type = number_range(1,6);
	else
	  data->trap_type = val[3];
	obj->more = data;
	break;
      }
    case ITEM_CLIMBABLE:
      {
	I_CLIMBABLE *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->up_down = val[0];
	data->above = val[2];
	data->below = val[3];
	obj->more = data;
	break;
      }
    case ITEM_BOOK:
      {
	I_BOOK *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->teaches = val[0];
	obj->more = data;
	break;
      }
    
    default:
      obj->more = NULL;
      break;
    }
  return;
}




SINGLE_OBJECT *
new_obj (void)
{
  SINGLE_OBJECT *obj;
  if (obj_free == NULL)
    {
      obj = mem_alloc (sizeof (*obj));
      obj->data_type = K_OBJ;
    }
  else
    {
      obj = obj_free;
      obj_free = obj_free->next;
      obj->data_type = K_OBJ;
    }
  clear_data (obj);
  return obj;
}



void 
obj_to (SINGLE_OBJECT * obj, void *thing)
{
  ROOM_DATA *in_room;
  SINGLE_OBJECT *obj_t;
  CHAR_DATA *ch;
  char *t = thing;
  if (!obj || !thing)
    return;
  if (*t == K_OBJ)
    {
      obj_t = (SINGLE_OBJECT *) thing;
      if (obj->carried_by && obj->wear_loc != -1)
	unequip_char (obj->carried_by, obj);
      obj->next_content = obj_t->contains;
      obj_t->contains = obj;
      obj->in_obj = obj_t;
      obj->in_room = NULL;
      obj->carried_by = NULL;
      obj->wear_loc = WEAR_NONE;
      for (; obj_t != NULL; obj_t = obj_t->in_obj)
	{
	  if (obj_t->carried_by != NULL && IS_PLAYER (obj_t->carried_by))
	    {
	      obj_t->carried_by->pcdata->carry_number += get_obj_number (obj);
	      obj_t->carried_by->pcdata->carry_weight += get_obj_weight (obj);
	    }
	}
    }
  else if (*t == K_ROOM)
    {
      in_room = (ROOM_DATA *) thing;
     if (obj->pIndexData->item_type == ITEM_LIGHT && IS_LIT (obj))
	++in_room->light;
     if (IS_SET(obj->pIndexData->extra_flags, ITEM_COMMANDSCRIPT))
       in_room->command_objs++;
      obj->next_content = in_room->contents;
      in_room->contents = obj;
      obj->in_room = in_room;
      obj->carried_by = NULL;
      obj->in_obj = NULL;
      obj->wear_loc = WEAR_NONE;
      
      return;
      
    }
  else if (*t == K_CHAR)
    {
      SINGLE_OBJECT *worn;
      ch = (CHAR_DATA *) thing;

      /* Place the new obj at the end of all the things carried */
      
      if (ch->carrying == NULL)
	{
	  ch->carrying = obj; 
	  obj->next_content = NULL;
	}
      else
	{
	  for (worn = ch->carrying; worn != NULL; worn = worn->next_content)
	    {
	      if (worn->wear_loc != WEAR_NONE && worn->next_content)
		continue;
	      else
		if (!worn->next_content ||
		    worn->next_content->wear_loc == WEAR_NONE)
		  {
		    obj->next_content = worn->next_content;
		    worn->next_content = obj;
		    break;
		  }
	    }
	}
      obj->carried_by = ch;
      obj->in_room = NULL;
      obj->in_obj = NULL;
      if (IS_PLAYER (ch))
	{
	  ch->pcdata->carry_number += get_obj_number (obj);
	  ch->pcdata->carry_weight += get_obj_weight (obj);
	  if (IS_SET(obj->pIndexData->extra_flags, ITEM_COMMANDSCRIPT))
	    ch->pcdata->command_objs++;
	}
     
    }
  return;
}



void 
obj_from (SINGLE_OBJECT * obj)
{
  CHAR_DATA *ch;
  ROOM_DATA *in_room;
  SINGLE_OBJECT *obj_frm;
  AUCTION  *auct;
  ch = obj->carried_by;
  in_room = obj->in_room;
  obj_frm = obj->in_obj;
  for (auct = auction_list; auct != NULL; auct = auct->next)
    {
      if (auct->item == obj)
        {
          clear_auction(auct);
          break;
        }
    }


  ch = obj->carried_by;
  in_room = obj->in_room;
  obj_frm = obj->in_obj;
  if (ch != NULL)
    {
      
      if (obj->wear_loc != WEAR_NONE)
	unequip_char (ch, obj);
      if (ch->carrying == obj)
	{
	  ch->carrying = obj->next_content;
	}
      else
	{
	  SINGLE_OBJECT *prev;
	  for (prev = ch->carrying; prev != NULL; prev = ((!prev->next_content) ? NULL : prev->next_content))
	    if (prev->next_content == obj)
	      {
		prev->next_content = obj->next_content;
		break;
	      }
	}
      obj->carried_by = NULL;
      obj->next_content = NULL;
      if (IS_PLAYER(ch))
	{
	  ch->pcdata->carry_number -= get_obj_number (obj);
	  ch->pcdata->carry_weight -= get_obj_weight (obj);
	  if (IS_SET(obj->pIndexData->extra_flags, ITEM_COMMANDSCRIPT))
	    ch->pcdata->command_objs--;
	}
    }
  else if (in_room != NULL)
    {
      if (obj == in_room->contents)
	{
	  in_room->contents = obj->next_content;
	}
      else
	{
	  SINGLE_OBJECT *prev;
	  for (prev = in_room->contents; prev; prev = prev->next_content)
	    if (prev->next_content == obj)
	      {
		prev->next_content = obj->next_content;
		break;
	      }
	}
      if (obj->pIndexData->item_type == ITEM_LIGHT && IS_LIT (obj))
	--obj->in_room->light;
       if (IS_SET(obj->pIndexData->extra_flags, ITEM_COMMANDSCRIPT))
	 in_room->command_objs--;
       if (in_room->command_objs < 0)
	 in_room->command_objs = 0;
       for (ch = obj->in_room->people; ch != NULL; ch = ch->next_in_room)
	 {
	   if (ch->fgt && ch->fgt->pulling == obj)
	     ch->fgt->pulling = NULL;
	 }
      obj->in_room = NULL;
      obj->next_content = NULL;
    }
  else if (obj_frm != NULL)
    {
      if (obj == obj_frm->contains)
	{
	  obj_frm->contains = obj->next_content;
	}
      else
	{
	  SINGLE_OBJECT *prev;
	  for (prev = obj_frm->contains; prev; prev = prev->next_content)
	    if (prev->next_content == obj)
	      {
		prev->next_content = obj->next_content;
		break;
	      }
	}
      obj->next_content = NULL;
      obj->in_obj = NULL;
      for (; obj_frm != NULL; obj_frm = obj_frm->in_obj)
	if (obj_frm->carried_by != NULL && IS_PLAYER (obj_frm->carried_by))
	  {
	    obj_frm->carried_by->pcdata->carry_number -= get_obj_number (obj);
	    obj_frm->carried_by->pcdata->carry_weight -= get_obj_weight (obj);
	  }
    }
  return;
}