EmlenMud2005-2006LOC/
EmlenMud2005-2006LOC/world/
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.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_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->damage_p = (val[0] == 0 ? 100 : val[0]);
	data->strength = val[1];
	data->ammo_type = val[4];
	obj->more = data;
	break;
      }
    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_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_AMMO:
      {
	I_AMMO *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->firstdice = val[0];
	data->seconddice = 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->material = val[0];
	data->spell1 = val[1];
	data->spell2 = val[2];
	data->spell3 = val[3];
	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_MINERAL:
      {
	I_MINERAL *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->type = 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_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_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];
	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->strip_possessions = 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))
	  SET_BIT(data->flags, CONT_HASTRAP);
	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;
      }
    case ITEM_REPELLANT:
      {
	I_SPRAY *data;
	int i;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->sprays = val[0];
	for (i = 1; i < 10; i++)
	  data->repels[i - 1] = val[i];
	obj->more = data;
	break;
      }
    case ITEM_HERB:
      {
	I_HERB *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->amount = val[0];
	data->potency = val[1];
	data->type = val[2];
	obj->more = data;
	break;
      }
    case ITEM_HIDE:
      {
	I_HIDE *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->type = val[0];
	obj->more = data;
	break;
      }
    case ITEM_WOOD:
      {
	I_WOOD *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->type = val[0];
	obj->more = data;
	break;
      }
    case ITEM_RAW:
      {
	I_RAW *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->type = val[0];
	obj->more = data;
	break;
      }
    case ITEM_CLOTH:
      {
	I_CLOTH *data;
	data = mem_alloc (sizeof (*data));
	data->tag = oi->item_type;
	data->type = 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;
      check_room_more (in_room);

     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->more->contents;
      in_room->more->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)
    {
      ch = (CHAR_DATA *) thing;
      obj->next_content = ch->carrying;
      ch->carrying = obj;
      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;
  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->more->contents)
	{
	  in_room->more->contents = obj->next_content;
	}
      else
	{
	  SINGLE_OBJECT *prev;
	  for (prev = in_room->more->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;
      check_clear_more (obj->in_room);
      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;
}