#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; }