#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);
}
if (oi->item_type == 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;
return;
}
if (oi->item_type == 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];
obj->more = data;
return;
}
if (oi->item_type == 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->pound_rating = val[4];
data->slash_rating = val[5];
data->pierce_rating = val[8];
data->max_condition = val[6];
data->condition_now = val[7];
obj->more = data;
return;
}
if (oi->item_type == 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;
return;
}
if (oi->item_type == 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;
return;
}
if (oi->item_type == 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;
return;
}
if (oi->item_type == ITEM_VEHICLE)
{
I_VEHICLE *data;
data = mem_alloc (sizeof (*data));
data->tag = oi->item_type;
data->sector_use = val[0];
obj->more = data;
return;
}
if (oi->item_type == 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;
return;
}
if (oi->item_type == ITEM_POTION || oi->item_type == ITEM_PILL || oi->item_type == 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;
return;
}
if (oi->item_type == 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;
return;
}
if (oi->item_type == 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;
return;
}
if (oi->item_type == ITEM_WAND || oi->item_type == 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;
return;
}
if (oi->item_type == 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;
return;
}
if (oi->item_type == ITEM_CONTAINER || oi->item_type == ITEM_CORPSE_PC ||
oi->item_type == 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';
obj->more = data;
return;
}
if (oi->item_type == 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;
return;
}
if (oi->vnum == OBJ_VNUM_BLOOD)
{
I_BLOOD *data;
data = mem_alloc (sizeof (*data));
data->tag = oi->item_type;
data->door = 0;
obj->more = data;
return;
}
if (oi->item_type == ITEM_BOOK)
{
I_BOOK *data;
data = mem_alloc (sizeof (*data));
data->tag = oi->item_type;
data->teaches = val[0];
obj->more = data;
return;
}
obj->more = NULL;
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;
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;
if (obj->in_room->more && obj->in_room->more->pcs>0) {
CHAR_DATA *t;
for (t=obj->in_room->more->people; t; t=t->next_in_room) {
if (IS_JAVA(t)) {
java_add_obj_window(t,obj);
}
}
}
return;
}
else if (*t == K_CHAR)
{
ch = (CHAR_DATA *) thing;
if (IS_PLAYER (ch) && obj->pIndexData->how_many > 0 && got)
check_write_limited (obj, obj->pIndexData->vnum);
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_JAVA(ch)) {
java_add_obj_inv_window(ch,obj);
}
}
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 (!quit_flag && obj->pIndexData->vnum < MAX_LIMITED && IS_PLAYER (ch) && obj->pIndexData->how_many > 0)
{
if (limited.limited_array[obj->pIndexData->vnum] > 0)
{
limited.limited_array[obj->pIndexData->vnum]--;
fprintf(stderr,"Reduced limited on %s to %d.\n",obj->pIndexData->short_descr,
limited.limited_array[obj->pIndexData->vnum]);
save_limited (obj->pIndexData->vnum);
}
}
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;
ch->pcdata->carry_number -= get_obj_number (obj);
ch->pcdata->carry_weight -= get_obj_weight (obj);
if (IS_JAVA(ch)) {
java_remove_obj_inv(ch,obj);
}
}
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 (obj->pIndexData->item_type == ITEM_BOAT && obj->boat)
{
BLIST *bt;
BLIST *bt_n;
if (base_blist && base_blist->vnum == obj->in_room->vnum)
{
bt = base_blist;
base_blist = base_blist->next;
save_boats ();
free_m (bt);
}
else
for (bt = base_blist; bt != NULL; bt = bt_n)
{
bt_n = bt->next;
if (bt_n && bt_n->vnum == obj->in_room->vnum)
{
bt->next = bt_n->next;
free_m (bt_n);
save_boats ();
goto ttj;
}
}
}
ttj:
if (obj->in_room->more && obj->in_room->more->pcs>0) {
CHAR_DATA *t;
for (t=obj->in_room->more->people; t; t=t->next_in_room) {
if (IS_JAVA(t)) {
java_remove_obj_stuff(t,obj);
}
}
}
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;
}