/
Archipelago/
Archipelago/doc/
Archipelago/lib/misc/
Archipelago/lib/plrobjs/
Archipelago/lib/plrobjs/P-T/
Archipelago/lib/world/mob/
Archipelago/lib/world/obj/
Archipelago/lib/world/shp/
Archipelago/lib/world/wld/
Archipelago/lib/world/zon/
Archipelago/slave/
/* ************************************************************************
*   File: objedit.c                                   Part of Archipelago *
*  Usage: online object editing commands. A Neil - July 1994              *
*                                                                         *
*  All rights reserved.  See license.doc for complete information.        *
*                                                                         *
*  Archipelago is based on                                                *
*  CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991.               *
*  Archipelago changes by Alastair J. Neil Copyright (C) 1993, 94, 95, 96 * 
 ************************************************************************ */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include "structs.h"
#include "utils.h"
#include "comm.h"
#include "interpreter.h"
#include "handler.h"
#include "db.h"
#include "limits.h"
#include "screen.h"
#include "objedit.h"
#include "spells.h"

char *rev_search_list(int num, struct list_index_type *list);
void objedit(struct descriptor_data *d, char *str);
void print_obj(struct descriptor_data *d);
int print_oflags(struct descriptor_data *d);
void print_ostr(struct descriptor_data *d);
void print_flags(struct descriptor_data *d);
int print_owear(struct descriptor_data *d);
int print_extras(struct descriptor_data *d);
void print_stats(struct descriptor_data *d);
int print_types(struct descriptor_data *d);
void print_aff(struct descriptor_data *d);
int print_affs(struct descriptor_data *d);
int print_ex(struct descriptor_data *d);
void print_exd(struct descriptor_data *d);
void print_osiz(struct descriptor_data *d);
int print_weaps(struct descriptor_data *d);
int print_cont_flags(struct descriptor_data *d);
int print_drinks(struct descriptor_data *d);
struct list_index_type *print_spells_n(struct descriptor_data *d, int ii, int type);
bool good_spell(int spl, int tf);
int print_odams(struct descriptor_data *d);
int print_oaff(struct descriptor_data *d);
void print_poisons(struct descriptor_data *d);
int calc_min_level_scpo(struct descriptor_data *d);
int is_goditem(struct obj_data *j);
void    copy_obj(struct obj_data *from, struct obj_data *to, bool cpyextras);
void    free_objstruct(struct obj_data *obj);
int assess_item(struct obj_data *j);

extern struct room_data *world;
extern struct obj_data *obj_proto;
extern int      top_of_world;
extern char	*wear_bits[];
extern char	*extra_bits[];
extern char	*item_types[];
extern char	*apply_types[];
extern char	*drinks[];
extern char	*sizes[];
extern char	*affected_bits[];
extern char     *damage_state[];
extern char     *spells[];
extern struct list_index_type CrIg[];
extern struct list_index_type Water[];
extern struct list_index_type CrCo[];
extern struct list_index_type ReCo[];
extern struct list_index_type ReTe[];
extern struct list_index_type MuCo[];
extern struct list_index_type Animal[];
extern struct list_index_type PeCo[];
extern struct list_index_type PeIm[];
extern struct list_index_type InIm[];
extern struct list_index_type TechForms[];
extern struct list_index_type Techs[];
extern struct list_index_type Forms[];
extern struct index_data *obj_index;
extern struct spell_info_type spell_info[];
extern char *weapon_type[];
extern char     *container_bits[];

void objedit(struct descriptor_data *d, char *str)
{

    int ja_flag,points,idesc, robj, room,rroom;
    char bufme[MAX_STRING_LENGTH];
    struct extra_descr_data *desc=0, *new_desc=0, *tmp_d=0;
    
    switch (d->oedit_mode){
    case MAIN_MODE:
	for (; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = MAIN_MODE;
	    print_obj(d);	    
	    break;}
	*str = LOWER(*str);
	if (*str == 'q'){
	    if (!IS_SET(d->obj_edit->obj_flags.extra_flags, ITEM_GODONLY)
		&& is_goditem(d->obj_edit))
		SET_BIT(d->obj_edit->obj_flags.extra_flags, ITEM_GODONLY);
	    else if (IS_SET(d->obj_edit->obj_flags.extra_flags, ITEM_GODONLY)
		&& !(is_goditem(d->obj_edit)))
		REMOVE_BIT(d->obj_edit->obj_flags.extra_flags, ITEM_GODONLY);
	    if ((robj = real_object(d->virtual)) < 0){
		SEND_TO_Q("Yikes object doesn't exist.\r\nReport this!\r\n",d);
		free_objstruct(d->obj_edit);
		d->obj_edit = 0;
		d->virtual = 0;		
		d->ia_flag = 0;
		d->iaff = 0;
		d->level = 0;
		d->iedsc = 0;
		d->cpyextras = 0;		
		d->prompt_mode = 1;
		REMOVE_BIT(PLR_FLAGS(d->character), PLR_BUILDING);
                act("$n returns from creating part of the world.",TRUE, d->character,0,0,TO_ROOM);
		return;}
	    d->obj_edit->item_number = robj;
	    copy_obj(d->obj_edit, obj_proto + robj, d->cpyextras);
	    SEND_TO_Q("Type saveobjs to save object.",d);    
	    free_objstruct(d->obj_edit);
	    d->obj_edit = 0;
	    d->virtual = 0;
	    d->ia_flag = 0;
	    d->iaff = 0;
	    d->level = 0;
	    d->iedsc = 0;
	    d->cpyextras = 0;
	    d->prompt_mode = 1;
	    REMOVE_BIT(PLR_FLAGS(d->character), PLR_BUILDING);
            act("$n returns from creating part of the world.",TRUE, d->character,0,0,TO_ROOM);
	    return;}
	else
	    switch (*str){
	    case 'f':
		d->oedit_mode = OF_EDIT;
		print_flags(d);
		return;
	    case 's':
		d->oedit_mode = OS_EDIT;
		print_stats(d);
		return;
	    case 'a':
		d->oedit_mode = OA_EDIT;
		print_aff(d);
		return;
	    case 'e':
		if (obj_index[d->obj_edit->item_number].number != 0)
		    {
			SEND_TO_Q("Cannot modify string info on loaded objects.\r\n",d);
			SEND_TO_Q("Press return to continue.\r\n",d);
			d->oedit_mode = MAIN_MODE;
			return;
		    }		
		d->oedit_mode =  OED_EDIT;
		d->ia_flag = print_ex(d);
		return;
	    case 'i':
	      if (d->obj_edit->obj_flags.type_flag == ITEM_LIGHT
		  || d->obj_edit->obj_flags.type_flag == ITEM_SRTLIGHT) {
		print_obj(d);
		SEND_TO_Q("Use the light duration for LIGHT objects\r\n",d);
		return;
	      }
	      sprintf(bufme,"%s Illumination level %s%d%s\r\n -ve numbers reduces room illumination, +ve increases room illumination.%s\r\n ",cy, byl,d->obj_edit->obj_flags2.light,gn,nrm);
	      SEND_TO_Q(bufme,d);
	      d->oedit_mode = OIL_EDIT;
	      return;
	    case 'v':
		switch (d->obj_edit->obj_flags.type_flag){
		case ITEM_SCABBARD:
		  d->oedit_mode = OSCABV_EDIT;
		  sprintf(bufme,"%sSpecific Weapon vnum for scabbard:%s",cy,nrm);
		  SEND_TO_Q(bufme,d);
		  return;
		case ITEM_SRTLIGHT:
		case ITEM_LIGHT:
		    d->oedit_mode = OVL_EDIT;
		    sprintf(bufme,"%s1/4 Hours of light:%s ",cy,nrm);
		    SEND_TO_Q(bufme,d);
		    return;
		case ITEM_SCROLL:
		case ITEM_POTION:
		case ITEM_WAND:
		case ITEM_STAFF:
		  print_obj(d);
		  return;
		case ITEM_PHILTRE:	
		case ITEM_CANTRIP:
		case ITEM_ROD:
		    d->oedit_mode = OVMTF_EDIT;
		    sprintf(bufme,"%sChoose a Technique and Form:%s\r\n",cy,nrm);
		    SEND_TO_Q(bufme,d);
		    d->list = print_spells_n(d, 0,-1);
		    return;
		case ITEM_WEAPON:
		    d->oedit_mode = OVWDD_EDIT;
		    sprintf(bufme,"%sNumber of Damage Dice:%s",cy,nrm);
		    SEND_TO_Q(bufme,d);
		    return;
		case ITEM_ARMOR:
		    d->oedit_mode = OVAC_EDIT;
		    sprintf(bufme,"%sEnhances A/C by (Negative A/C bad):%s ",cy,nrm);
		    SEND_TO_Q(bufme,d);
		    return;
		case ITEM_VIS:
		  d->oedit_mode = OVTECH_EDIT;
		  sprintf(bufme, "%sTechnique No. for vis, 0 to clear:%s\r\n",cy,nrm);
		  SEND_TO_Q(bufme,d);
		  d->list = print_spells_n(d,1,-2);	      		  
		  return;		  
		case ITEM_CONTAINER:
		    d->oedit_mode = OVCONTC_EDIT;
		    sprintf(bufme,"%sContainer Capacity (> %d):%s ",cy,d->obj_edit->obj_flags.weight,nrm);
		    SEND_TO_Q(bufme,d);
		    return;		    		    
		case ITEM_DRINKCON:
		case ITEM_FOUNTAIN:		    
		    d->oedit_mode = OVDRINK_EDIT;
		    sprintf(bufme,"%sContainer Capacity:%s ",cy,nrm);
		    SEND_TO_Q(bufme,d);
		    return;
		case ITEM_FOOD:
		    d->oedit_mode = OVFOOD_EDIT;
		    sprintf(bufme,"%sHours to fill stomache:%s ",cy,nrm);
		    SEND_TO_Q(bufme,d);
		    return;
		case ITEM_KEY:
		    d->oedit_mode = OVKEY_EDIT;
		    sprintf(bufme,"%sKey-type (must match lock type for door):%s ",cy,nrm);
		    SEND_TO_Q(bufme,d);
		    return;
		case ITEM_MONEY:
		    d->oedit_mode = OVGOLD_EDIT;
		    sprintf(bufme,"%sGold amount (crowns*1000) > 0:%s ",cy,nrm);
		    SEND_TO_Q(bufme,d);
		    return;		    
		default:
		    print_obj(d);
		    return;
		}
	    case 't':
		if (obj_index[d->obj_edit->item_number].number != 0)
		    {
			SEND_TO_Q("Cannot modify string info on loaded objects.\r\n",d);
			SEND_TO_Q("Press return to continue.\r\n",d);
			d->oedit_mode = MAIN_MODE;
			return;
		    }		
		d->oedit_mode = OSTR_EDIT;
		print_ostr(d);
		return;
	    case 'd':
		d->ia_flag = print_odams(d);
		d->oedit_mode = OVDS_EDIT;
		return;
	    case 'z':
		print_osiz(d);
		d->oedit_mode = OVS_EDIT;
		return;
	    case 'l':
		sprintf(bufme,"%sObject Limit: %s%d%s\r\n",cy,gn,d->obj_edit->obj_flags.value[6],nrm);
		SEND_TO_Q(bufme,d);	    
		sprintf(bufme,"Enter new object limit:");
		SEND_TO_Q(bufme,d); 
		d->oedit_mode = OVLM_EDIT;
		return;				
	    default:
		SEND_TO_Q("Illegal Entry, try again\r\n",d);
		print_obj(d);
		SEND_TO_Q("\r\nEnter a letter a-w or  Q to Quit\r\n",d);
		return;
	    }
	break;
    case OSCABV_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    sprintf(bufme,"%sScabbard weapon unchanged.\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    sprintf(bufme,"%sEnter Scabbard weapon type:%s",cy,nrm);
	    SEND_TO_Q(bufme,d);	    
	    d->oedit_mode = OSCABV2_EDIT;
	    d->ia_flag = print_weaps(d);
	    return;}
	points = atoi(str);			
	if (points <= 0 || (real_object(points) < 0)){
	    sprintf(bufme,"\r\n%sIllegal number.%s\r\nEnter weapon vnum:",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    break;
	}
	else if (obj_proto[real_object(points)].obj_flags.type_flag
		 != ITEM_WEAPON) {
	  sprintf(bufme,"\r\n%sThat's not a weapon.%s\r\nEnter weapon vnum:",rd,nrm);
	  SEND_TO_Q(bufme,d);
	  break;
	}
	else{
	    d->obj_edit->obj_flags.value[0] = points;
	    d->obj_edit->obj_flags.value[3] = 0;
	    d->oedit_mode = MAIN_MODE;
	    print_obj(d);	    
	    return;
	}
    case OSCABV2_EDIT:
      	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    print_weaps(d);
	    break;}
	if (is_number(str)){
	    ja_flag = atoi(str);
	    if (ja_flag >= 0 && ja_flag <= d->ia_flag )
		{
		    d->obj_edit->obj_flags.value[3] = ja_flag;
		    d->ia_flag =  print_weaps(d);
		    d->obj_edit->obj_flags.value[0] = 0;
		    break;

		}
	    else{
		SEND_TO_Q("Illegal weapon type.\r\n",d);
		d->ia_flag =  print_weaps(d);
		break;
	    }
	}
	else if (*str == 'Q' || *str == 'q'){
	    d->oedit_mode = MAIN_MODE;
	    print_obj(d);
	    break;}
	else{
	    SEND_TO_Q("Illegal weapon type.\r\n",d);
	    d->ia_flag =  print_weaps(d);
	    break;
	}
    case OVGOLD_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    sprintf(bufme,"%sGold amount unchanged.\r\n\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    d->oedit_mode = MAIN_MODE;
	    print_obj(d);
	    return;}
	points = atoi(str);			
	if (points <= 0){
	    sprintf(bufme,"\r\n%sIllegal number.%s\r\nEnter gold amount (crowns*1000) > 0:",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    break;
	}
	else{
	    d->obj_edit->obj_flags.value[0] = points;
	    d->oedit_mode = MAIN_MODE;
	    print_obj(d);
	    return;}
    case OVKEY_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    sprintf(bufme,"%sKey type unchanged.\r\n\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    print_obj(d) ;
	    d->oedit_mode = MAIN_MODE;
	    return;}
	points = atoi(str);			
	if (points < 0){
	    sprintf(bufme,"\r\n%sIllegal number.%s\r\nEnter key type >= 0:",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    break;
	}
	else{
	    d->obj_edit->obj_flags.value[0] = points;
	    print_obj(d) ;
	    d->oedit_mode = MAIN_MODE;
	    return;}
    case OVFOOD_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    sprintf(bufme,"%sFood value unchanged.\r\n\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    sprintf(bufme,"%sPoisoned (y/n)?:%s",cy,nrm);
	    SEND_TO_Q(bufme,d);
	    d->oedit_mode = OVPOIS_EDIT;
	    return;}
	points = atoi(str);			
	if (points < 0){
	    sprintf(bufme,"\r\n%sIllegal number.%s\r\nEnter food value >= 0:",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    break;
	}
	else{
	    d->obj_edit->obj_flags.value[0] = points;
	    sprintf(bufme,"%sPoisoned (y/n)?:%s",cy,nrm);
	    SEND_TO_Q(bufme,d);
	    d->oedit_mode = OVPOIS_EDIT;
	    return;}
    case OVDRINK_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    sprintf(bufme,"%sCapacity unchanged.\r\n\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    sprintf(bufme,"%sDrinks Left:%s",cy,nrm);
	    SEND_TO_Q(bufme,d);
	    d->oedit_mode = OVDRINKSL_EDIT;
	    return;}
	points = atoi(str);			
	if (points <= 0){
	    sprintf(bufme,"\r\n%sIllegal number.%s\r\nEnter container capacity > 0:",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    break;
	}
	else{
	    d->obj_edit->obj_flags.value[0] = points;
	    sprintf(bufme,"%sDrinks Left:%s",cy,nrm);
	    SEND_TO_Q(bufme,d);
	    d->oedit_mode = OVDRINKSL_EDIT;
	    return;}
    case OVDRINKSL_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    sprintf(bufme,"%sDrink left unchanged.\r\n\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    d->ia_flag = print_drinks(d);
	    d->oedit_mode = OVDRINKTY_EDIT;
	    return;}
	points = atoi(str);			
	if (points < 0){
	    sprintf(bufme,"\r\n%sIllegal number.%s\r\nEnter drinks left >= 0:",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    break;
	}
	else{
	    d->obj_edit->obj_flags.value[1] = points;
	    d->ia_flag = print_drinks(d);
	    d->oedit_mode = OVDRINKTY_EDIT;
	    return;}
    case OVDRINKTY_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = OVDRINKTY_EDIT;
	    d->ia_flag = print_drinks(d);
	    break;}
	if (is_number(str)){
	    ja_flag = atoi(str);
	    if (ja_flag >= 0 && ja_flag <= d->ia_flag )
		{
		    d->obj_edit->obj_flags.value[2] = ja_flag;
		    d->ia_flag =  print_drinks(d);
		    break;

		}
	    else{
		SEND_TO_Q("Illegal drink type.\r\n",d);
		d->ia_flag =  print_drinks(d);
		break;
	    }
	}
	else if (*str == 'Q' || *str == 'q'){
	    d->oedit_mode = OVPOIS_EDIT;
	    sprintf(bufme,"%sPoisoned (y/n)?:%s",cy,nrm);
	    SEND_TO_Q(bufme,d);
	    break;}
	else{
	    SEND_TO_Q("Illegal drink type.\r\n",d);
	    d->ia_flag =  print_drinks(d);
	    break;}
    case OVPOIS_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    sprintf(bufme,"%sPoisoned state unchanged.\r\n\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    sprintf(bufme,"%sEnter Poison level.\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    print_poisons(d);
	    d->oedit_mode = OVPOISLEV_EDIT;
	    return;}
	else if (*str == 'y' || *str == 'Y'){
	    d->obj_edit->obj_flags.value[3] = 1;
	    sprintf(bufme,"%sEnter Poison level.\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    print_poisons(d);
	    d->oedit_mode = OVPOISLEV_EDIT;
	    return;}
	else {
	    d->obj_edit->obj_flags.value[3] = 0;
	    print_obj(d) ;
	    d->oedit_mode = MAIN_MODE;
	    return;}
    case OVPOISLEV_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    sprintf(bufme,"%sPoison unchanged.\r\n\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    print_obj(d);
	    d->oedit_mode = MAIN_MODE;
	}
	points = atoi(str);			
	if (points < 0 || points > 5){
	    sprintf(bufme,"\r\n%sIllegal number.%s Enter Poison > 0 <=5.\r\n",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    print_poisons(d);
	    break;;}
	else{
	    d->obj_edit->obj_flags.value[7] = points;
	    print_obj(d);
	    d->oedit_mode = MAIN_MODE;
	    break;}
    case OVCONTC_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    sprintf(bufme,"%sCapacity unchanged.\r\n\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    d->ia_flag = print_cont_flags(d);
	    d->oedit_mode = OVCFLAGS_EDIT;
	    return;}
	points = atoi(str);			
	if (points < d->obj_edit->obj_flags.weight){
	    sprintf(bufme,"\r\n%sIllegal number.%s\r\nEnter container capacity >  %d:",rd,nrm,d->obj_edit->obj_flags.weight);
	    SEND_TO_Q(bufme,d);
	    break;
	}
	else{
	    d->obj_edit->obj_flags.value[0] = points;
	    d->oedit_mode = OVCFLAGS_EDIT;
	    d->ia_flag = print_cont_flags(d);
	    return;}
    case OVCFLAGS_EDIT:
	    for ( ; isspace(*str); str++)
		;
	if (!*str){
		d->oedit_mode = OVCFLAGS_EDIT;
		d->ia_flag = print_cont_flags(d);
		break;}
	if (is_number(str)){
	    ja_flag = atoi(str);
	    if (ja_flag >= 0 && ja_flag <= d->ia_flag )
		    {
			if (!IS_SET(d->obj_edit->obj_flags.value[1], 1<<ja_flag))
			    SET_BIT(d->obj_edit->obj_flags.value[1], 1<<ja_flag);
			else
			    REMOVE_BIT(d->obj_edit->obj_flags.value[1], 1<<ja_flag);
			d->ia_flag = print_cont_flags(d);
			break;
			
		    }
	    else{
		SEND_TO_Q("Illegal Flag.\r\n",d);
		d->ia_flag = print_cont_flags(d);
		break;
	    }
	}
	else if (*str == 'Q' || *str == 'q'){
	    sprintf(bufme,"Item number of key for lock (-1 == no lockability): %s%d%s",cy,d->obj_edit->obj_flags.value[2],nrm);
	    SEND_TO_Q(bufme,d);
	    d->oedit_mode = OVCKEY_EDIT;
	    break;}
	else{
	    SEND_TO_Q("Illegal Flag.\r\n",d);
	    d->ia_flag = print_cont_flags(d);
	    break;}
    case OVCKEY_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    sprintf(bufme,"%sKey number unchanged.\r\n\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);	    
	    d->oedit_mode = OVROOM_EDIT;
	    sprintf(bufme,"%sContainer room: %s%d%s\r\n",cy,rd,
		(d->obj_edit->obj_flags.value[3] > 0 ?
		d->obj_edit->obj_flags.value[3] : 0), nrm);
	    SEND_TO_Q(bufme,d);
	    sprintf(bufme,"%sEnter new container room:%s",cy,nrm);
	    SEND_TO_Q(bufme,d);
	    return;}
	points = atoi(str);			
	if (points > 99999){
	    SEND_TO_Q("\r\nIllegal number.\r\nEnter new key number, <99999:",d);
	    break;
	}
	else{
	    if (points < 0)
		points = -1;
	    d->obj_edit->obj_flags.value[2] = points;
	    d->oedit_mode = OVROOM_EDIT;
	    sprintf(bufme,"%sContainer room: %s%d%s\r\n",cy,rd,
		(d->obj_edit->obj_flags.value[3] > 0 ?
		d->obj_edit->obj_flags.value[3] : 0), nrm);
	    SEND_TO_Q(bufme,d);
	    sprintf(bufme,"%sEnter new container room:%s",cy,nrm);
	    SEND_TO_Q(bufme,d);
	    return;}
    case OVROOM_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    sprintf(bufme,"\r\n%sContainer To Room unchanged.%s",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    d->oedit_mode = MAIN_MODE;
	    print_obj(d);
	    return;}
	room = atoi(str);
	if ((rroom = real_room(room)) == NOWHERE){
	    sprintf(bufme,"%sNo such Room.%s",rd,nrm);
	    SEND_TO_Q(bufme,d);	    
	    sprintf(bufme,"%sEnter new container room:%s ",cy,nrm);
	    SEND_TO_Q(bufme,d);
	    d->oedit_mode = OVROOM_EDIT;
	    break;}
	else{
	    d->obj_edit->obj_flags.value[3] = room;
	    d->oedit_mode = MAIN_MODE;
	    print_obj(d);
	    return;}
    case OVTECH_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->list = print_spells_n(d,1,-2);
	    break;}
	if (is_number(str)){
	    ja_flag = atoi(str);
	    if (ja_flag == 0){
		  d->obj_edit->obj_flags.value[1] = 0;	      
		  d->list = print_spells_n(d,1,-2);
		  break;
	    }
	    if (rev_search_list(ja_flag, d->list))
		{
		  d->obj_edit->obj_flags.value[1] = ja_flag;
		  d->list = print_spells_n(d,1,-2);
		  break;
		}
	    else{
	      SEND_TO_Q("Illegal technique No. 0 to clear\r\n",d);
	      d->list = print_spells_n(d,1,-2);
	      break;
	    }
	}
	else if (*str == 'Q' || *str == 'q'){
	  sprintf(bufme,"%sEnter Form No. 0 to clear:%s\r\n ",cy,nrm);
	  SEND_TO_Q(bufme,d);
	  d->list = print_spells_n(d,2,-3);	  
	  d->oedit_mode = OVFORMS_EDIT;
	  break;}
	else{
	  SEND_TO_Q("Illegal technique No. 0 to clear\r\n",d);
	  d->list =  print_spells_n(d,1,-2);
	  break;}
    case OVFORMS_EDIT:
      for ( ; isspace(*str); str++)
	;
      if (!*str){
	d->list = print_spells_n(d,2,-3);
	break;}
      if (is_number(str)){
	ja_flag = atoi(str);
	if (ja_flag == 0){
	  d->obj_edit->obj_flags.value[2] = 0;	      
	  d->list = print_spells_n(d,2,-3);
	  break;
	}
	if (rev_search_list(ja_flag, d->list))
	  {
	    d->obj_edit->obj_flags.value[2] = ja_flag;
	    d->list =print_spells_n(d,2,-3);
	    break;
	  }
	else{
	  SEND_TO_Q("Illegal Form.\r\n",d);
	  d->list = print_spells_n(d,2,-3);
	  break;
	}
      }
      else if (*str == 'Q' || *str == 'q'){
	if (d->obj_edit->obj_flags.value[2] == 0 &&
	    d->obj_edit->obj_flags.value[1] == 0){
	  d->obj_edit->obj_flags.value[3] = 0;  
	  print_obj(d);
	  d->oedit_mode = MAIN_MODE;
	  return;
	}
	sprintf(bufme,"%sNumber of pawns: %d%s "
		,cy,d->obj_edit->obj_flags.value[3],nrm);
	SEND_TO_Q(bufme,d);	  
	sprintf(bufme,"%sEnter new number of pawns >0:%s ",cy,nrm);
	SEND_TO_Q(bufme,d);
	d->oedit_mode = OVPAWNS_EDIT;
	break;	      
	break;}
      else{
	SEND_TO_Q("Illegal Form No. 0 to clear:\r\n",d);
	d->list =  print_spells_n(d,2,-3);
	break;}
    case OVPAWNS_EDIT:
      for ( ; isspace(*str); str++)
	;
      if (!*str) {
	if (d->obj_edit->obj_flags.value[3] < 1){
	  sprintf(bufme,"%sSetting pawns to default = 1.%s", rd, nrm);
	  d->obj_edit->obj_flags.value[3] = 1;
	  SEND_TO_Q(bufme,d);
	  print_obj(d);
	  d->oedit_mode = MAIN_MODE;
	}
	sprintf(bufme,"%sPawns unchanged.\r\n\r\n%s",rd,nrm);
	SEND_TO_Q(bufme,d);
	print_obj(d);
	d->oedit_mode = MAIN_MODE;
	return;}
      points = atoi(str);			
      if (points > 10 || points < 1){
	sprintf(bufme,"\r\n%sIllegal number.%s\r\nNumber of pawns >= 1 <= 10:",rd,nrm);
	SEND_TO_Q(bufme,d);
	break;
      }
      else{
	d->obj_edit->obj_flags.value[3] = points;
	print_obj(d);
	d->oedit_mode = MAIN_MODE;
	return;}      
    case OVAC_EDIT:
      for ( ; isspace(*str); str++)
	;
      if (!*str){
	sprintf(bufme,"%sA/C enhancement unchanged.\r\n\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    sprintf(bufme,"%sStopping power:%s",cy,nrm);
	    SEND_TO_Q(bufme,d);
	    d->oedit_mode = OVWAST_EDIT;
	    return;}
	points = atoi(str);			
	if (points > 40 || points < -40){
	    sprintf(bufme,"\r\n%sIllegal number.%s\r\nEnter A/C enhancement >= -40 <= 40:",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    break;
	}
	else{
	    d->obj_edit->obj_flags.value[0] = points;
	    d->oedit_mode = OVWAST_EDIT;
	    sprintf(bufme,"%sStopping power:%s",cy,nrm);
	    SEND_TO_Q(bufme,d);
	    return;}
    case OVWAST_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    sprintf(bufme,"%sStopping power unchanged.\r\n\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    print_obj(d);
	    d->oedit_mode = MAIN_MODE;
	    return;}
	points = atoi(str);			
	if (points > 20 || points < 0){
	    sprintf(bufme,"\r\n%sIllegal number.%s\r\nEnter A/C enhancement >= 0 <= 20:",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    break;
	}
	else{
	    d->obj_edit->obj_flags.value[1] = points;
	    print_obj(d);
	    d->oedit_mode = MAIN_MODE;
	    return;}
    case OVWDD_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    sprintf(bufme,"%sNumber of damage dice unchanged.\r\n\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    sprintf(bufme,"%sSize of Damage Dice:%s",cy,nrm);
	    SEND_TO_Q(bufme,d);
	    d->oedit_mode = OVWSDD_EDIT;
	    return;}
	points = atoi(str);			
	if (points < 0){
	    sprintf(bufme,"\r\n%sIllegal number.%s\r\nEnter number of damage dice > 0 <= 40:",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    break;
	}
	else{
	    d->obj_edit->obj_flags.value[1] = points;
	    d->oedit_mode = OVWSDD_EDIT;
	    sprintf(bufme,"%sSize of Damage Dice:%s",cy,nrm);
	    SEND_TO_Q(bufme,d);
	    return;}
    case OVWSDD_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    sprintf(bufme,"%sSize of damage dice unchanged.\r\n\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    sprintf(bufme,"%sWeapon type:%s",cy,nrm);
	    SEND_TO_Q(bufme,d);
	    d->ia_flag = print_weaps(d);
	    d->oedit_mode = OVWT_EDIT;
	    return;}
	points = atoi(str);			
	if (points < 0){
	    sprintf(bufme,"\r\n%sIllegal number.%s\r\nEnter number of damage dice > 0 <= 20:",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    break;
	}
	else{
	    d->obj_edit->obj_flags.value[2] = points;
	    sprintf(bufme,"%sWeapon type:%s",cy,nrm);
	    SEND_TO_Q(bufme,d);
	    d->ia_flag = print_weaps(d);
	    d->oedit_mode = OVWT_EDIT;
	    return;}
    case OVWT_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = OVWT_EDIT;
	    print_weaps(d);
	    break;}
	if (is_number(str)){
	    ja_flag = atoi(str);
	    if (ja_flag >= 0 && ja_flag <= d->ia_flag )
		{
		  d->obj_edit->obj_flags.value[3] = ja_flag;
		  d->ia_flag =  print_weaps(d);
		  break;
		  
		}
	    else{
	      SEND_TO_Q("Illegal weapon type.\r\n",d);
	      d->ia_flag =  print_weaps(d);
	      break;
	    }
	}
	else if (*str == 'Q' || *str == 'q'){
	  d->oedit_mode = MAIN_MODE;
	  print_obj(d);
	  break;}
	else{
	  SEND_TO_Q("Illegal weapon type.\r\n",d);
	  d->ia_flag =  print_weaps(d);
	  break;}
    case OVWSC_EDIT:
      for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    sprintf(bufme,"%sMax Charges unchanged.\r\n\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    d->oedit_mode = MAIN_MODE;
	    print_obj(d);
	    return;}
	points = atoi(str);			
	if (points > 20 || points <= 0){
	    sprintf(bufme,"\r\n%sIllegal number.%s\r\nEnter Max Charges > 0 <= 20:",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    break;
	}
	else{
	    d->obj_edit->obj_flags.value[2] = points;
	    d->obj_edit->obj_flags.value[3] = points;	    
	    d->oedit_mode = MAIN_MODE;
	    print_obj(d);
	    return;}
    case OVMTF_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = OVMTF_EDIT;
	    d->list = print_spells_n(d,0,-1);
	    break;}
	if (is_number(str)){
	    ja_flag = atoi(str);
	    if (rev_search_list(ja_flag, d->list))
		{
		    d->obj_edit->obj_flags.value[0] = ja_flag;
		    d->list =  print_spells_n(d,0,-1);
		    break;

		}
	    else{
		SEND_TO_Q("Illegal technique and form No.\r\n",d);
		d->list =  print_spells_n(d,0,-1);
		break;
	    }
	}
	else if (*str == 'Q' || *str == 'q'){
	    sprintf(bufme,"%sChoose a Spell:%s ",cy,nrm);
	    d->list = print_spells_n(d,1,d->obj_edit->obj_flags.value[0]);
	    SEND_TO_Q(bufme,d);
	    d->oedit_mode = OVMSPL_EDIT;
	    break;}
	else{
	    SEND_TO_Q("Illegal technique and form No.\r\n",d);
	    d->list =  print_spells_n(d,0, -1);
	    break;}
    case OVMSPL_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = OVMSPL_EDIT;
	    d->list = print_spells_n(d,1,d->obj_edit->obj_flags.value[0]);
	    break;}
	if (is_number(str)){
	    ja_flag = atoi(str);
	    if (rev_search_list(ja_flag, d->list))
		{
		  if (!spell_info[ja_flag].spll_pointer) {
		    SEND_TO_Q("Spell not implimented yet choose again.\r\n",d);
		    d->list
		      =print_spells_n(d,1,d->obj_edit->obj_flags.value[0]);
		    break;
		  }
		  d->obj_edit->obj_flags.value[1] = ja_flag;
		  d->list =print_spells_n(d,1,d->obj_edit->obj_flags.value[0]);
		  break;
		}
	    else{
	      SEND_TO_Q("Illegal Spell No.\r\n",d);
	      d->list = print_spells_n(d,1,d->obj_edit->obj_flags.value[0]);
	      break;
	    }
	}
	else if (*str == 'Q' || *str == 'q'){
	  if (d->obj_edit->obj_flags.type_flag == ITEM_CANTRIP ||
	      d->obj_edit->obj_flags.type_flag == ITEM_PHILTRE) {
	    d->oedit_mode = MAIN_MODE;
	    print_obj(d);
	    return;
	  }
	  sprintf(bufme,"%sMax Charges > 0 <= 20:%s ",cy,nrm);
	  SEND_TO_Q(bufme,d);
	  d->oedit_mode = OVWSC_EDIT;
	  break;}
	else{
	  SEND_TO_Q("Illegal spell No.\r\n",d);
	  d->list =  print_spells_n(d,1,d->obj_edit->obj_flags.value[0]);
	  break;}
    case OVSPLEV_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = MAIN_MODE;
	    sprintf(bufme,"%sSpell Level unchanged.\r\n\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);	    
	    print_obj(d) ;
	    return;}
	points = atoi(str);			
	if (points < d->level || points > LEVEL_IMPL){
	    sprintf(bufme,"\r\n%sIllegal number.%s\r\nEnter new Spell level >= %d <= 227:",rd,nrm,d->level);
	    SEND_TO_Q(bufme,d);
	    break;
	}
	else{
	    d->obj_edit->obj_flags.value[0] = points;
	    d->oedit_mode = MAIN_MODE;
	    print_obj(d) ;
	    return;}
    case OIL_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = MAIN_MODE;
	    sprintf(bufme,"%sLight duration unchanged.\r\n\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);	    
	    print_obj(d) ;
	    return;}
	points = atoi(str);			
	if (points > 30 || points < -30){
	    SEND_TO_Q("\r\nIllegal number.\r\nEnter new illumination value >= -30  and <= 30:",d);
	    break;
	}
	d->obj_edit->obj_flags2.light = points;
	d->oedit_mode = MAIN_MODE;
	print_obj(d) ;
	return;
    case OVL_EDIT:
      for ( ; isspace(*str); str++)
	;
      if (!*str){
	d->oedit_mode = MAIN_MODE;
	sprintf(bufme,"%sLight duration unchanged.\r\n\r\n%s",rd,nrm);
	SEND_TO_Q(bufme,d);	    
	print_obj(d) ;
	return;}
      points = atoi(str);			
      if (points > 160 || points < 0){
	SEND_TO_Q("\r\nIllegal number.\r\nEnter new light duration 1/4 hours, <= 160:",d);
	break;
      }
      d->obj_edit->obj_flags.value[2] = points;
      d->oedit_mode = MAIN_MODE;
      print_obj(d) ;
      return;
    case OVDS_EDIT:
      for ( ; isspace(*str); str++)
	;
      if (!*str){
	d->oedit_mode = OVDS_EDIT;
	d->ia_flag = print_odams(d);
	break;}
      if (*str == 'Q' || *str == 'q'){
	    d->oedit_mode = MAIN_MODE;
	    print_obj(d);	
	    break;}
	else if ((ja_flag = atoi(str)) >= -3){
	    if (ja_flag >= -3 && ja_flag <= d->ia_flag )
		{
		    d->obj_edit->obj_flags.value[4] = ja_flag;
		    d->oedit_mode = MAIN_MODE;
		    print_obj(d);
		    break;
		}
	    else{
		SEND_TO_Q("Illegal damage state.\r\n",d);
		d->oedit_mode = OVDS_EDIT;
		d->ia_flag =  print_odams(d);
		break;
	    }
	}
	else{
	    SEND_TO_Q("Illegal damage state.\r\n",d);
	    d->oedit_mode = OVDS_EDIT;
	    d->ia_flag =  print_odams(d);
	    break;}
    case OVS_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = MAIN_MODE;
	    sprintf(bufme,"%sSize unchanged.\r\n\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    print_obj(d);
	    return;}
	points = atoi(str);			
	if (points > 6 || points < 0){
	    SEND_TO_Q("\r\nIllegal size.\r\nEnter new size,>= 1 <= 6:",d);
	    break;
	}
	else{
	    d->obj_edit->obj_flags.value[5] = points;
	    print_obj(d);
	    d->oedit_mode = MAIN_MODE;
	    return;}
    case OVLM_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = MAIN_MODE;
	    sprintf(bufme,"%sObject limit unchanged.\r\n\r\n%s",rd,nrm);
	    SEND_TO_Q(bufme,d);
	    print_obj(d);
	    return;}
	points = atoi(str);			
	if (points > 200 || points < 0){
	    SEND_TO_Q("\r\nIllegal limit.\r\nEnter new limit,>= 0 <= 200:",d);
	    break;
	}
	else{
	    d->obj_edit->obj_flags.value[6] = points;
	    d->oedit_mode = MAIN_MODE;
	    print_obj(d);
	    return;}
    case OED_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = OED_EDIT;
	    sprintf(bufme,"%sNo such extra description.%s",rd,nrm);
	    d->ia_flag = print_ex(d);
	    SEND_TO_Q(bufme,d);	    
	    return;}
	else if (*str == 'q' || *str == 'Q'){
	    print_obj(d);
	    d->oedit_mode = MAIN_MODE;
	    return;}
	else if (*str == 'c' || *str == 'C'){
	    if (obj_index[d->obj_edit->item_number].number != 0)
		{
		    SEND_TO_Q("Cannot modify extra descriptions on loaded objects.\r\n",d);
		    d->ia_flag = print_ex(d);
		    return;
		}
	    d->cpyextras = TRUE;
	    CREATE(new_desc, struct extra_descr_data, 1);
	    new_desc->keyword =0;
	    new_desc->description =0;
	    new_desc->next = 0;
	    d->iedsc = 0;
	    tmp_d = d->obj_edit->ex_description;
	    if (tmp_d){
		while (tmp_d->next){
		    tmp_d = tmp_d->next;
		    d->iedsc++;}
		tmp_d->next = new_desc;
	    }
	    else
		 d->obj_edit->ex_description = new_desc;
	    d->oedit_mode = OEDD_EDIT;
	    print_exd(d);
	    return;
	}
	points = atoi(str);
	if (obj_index[d->obj_edit->item_number].number != 0)
	    {
		SEND_TO_Q("Cannot modify extra descriptions on loaded objects.\r\n",d);
		d->ia_flag = print_ex(d);
		return;
	    }
	if(!d->obj_edit->ex_description){
	    SEND_TO_Q("\r\nDon't be silly, press return to continue:",d);
	    break;
	}
	if (points < 0 || points > d->ia_flag){
	    SEND_TO_Q("\r\nIllegal description #.\r\nEnter new extra description #:",d);
	    break;
	}
	else{
	    d->cpyextras = TRUE;	
	    d->iedsc = points;
	    d->oedit_mode = OEDD_EDIT;
	    print_exd(d);
	    return;}
    case OEDD_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = OEDD_EDIT;
	    print_exd(d);
	    return;}
	*str = LOWER(*str);
	if (*str != 'k' && *str != 'd' && *str != 'p' && *str != 'q'){
	    SEND_TO_Q("No such member.",d);
	    print_exd(d);
	    break;}
	switch(*str){
	case 'k':
	    desc = d->obj_edit->ex_description;
	    idesc = 0;
	    while(idesc < d->iedsc && desc->next){
		desc = desc->next;
		++idesc;}
	    d->str = &(desc->keyword);
	    free(*d->str);
	    *d->str = 0;
	    d->max_str = 80;
	    SEND_TO_Q("Enter new keywords. No carriage return at the end\r\n, terminate with a @@,\r\n",d);
	    return;
	case 'd':
	    desc = d->obj_edit->ex_description;
	    idesc = 0;
	    while(idesc < d->iedsc && desc->next){
		desc = desc->next;
		++idesc;}
	    d->str = &(desc->description);
	    free(*d->str);
	    *d->str = 0;
	    d->max_str = 3072;
	    SEND_TO_Q("Enter new keywords. No carriage return at the end\r\n, terminate with a @@,\r\n",d);
	    return;
	case 'p':
	    desc = d->obj_edit->ex_description;
	    idesc = 0;
	    while(idesc < d->iedsc && desc->next){
		desc = desc->next;
		++idesc;}
	    if (desc == d->obj_edit->ex_description){
		tmp_d = desc->next;
		if(desc->keyword)		
		    free(desc->keyword);
		if(desc->description)		
		free(desc->description);		
		free(desc);
		d->obj_edit->ex_description = tmp_d;}
	    else{
		for (tmp_d = d->obj_edit->ex_description;
		     tmp_d;tmp_d = tmp_d->next)
		    if (tmp_d->next == desc)
			break;
		tmp_d->next = desc->next;
		if(desc->keyword)
		    free(desc->keyword);
		if(desc->description)				
		    free(desc->description);				
		free(desc);
	    }
	case 'q':
	    d->ia_flag = print_ex(d);
	    d->oedit_mode = OED_EDIT;
	    return;
	}
    case OA_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = OS_EDIT;
	    sprintf(bufme,"%sNo such affect number.%s",rd,nrm);
	    print_aff(d);
	    SEND_TO_Q(bufme,d);	    
	    return;}
	else if (*str == 'q' || *str == 'Q'){
	    print_obj(d);
	    d->oedit_mode = MAIN_MODE;
	    return;}
	points = atoi(str);			
	if (points < 0 || points > MAX_OBJ_AFFECT){
	    SEND_TO_Q("\r\nIllegal affect #.\r\nEnter new obj affect #:",d);
	    break;
	}
	else{
	    d->iaff = points;
	    d->oedit_mode = OAL_EDIT;
	    d->ia_flag  = print_affs(d);
	    return;}
    case OAL_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = OAL_EDIT;
	    d->ia_flag = print_affs(d);
	    break;}
	if (is_number(str)){
	    ja_flag = atoi(str);
	    if (ja_flag >= 0 && ja_flag <= d->ia_flag )
		{
		    d->obj_edit->affected[d->iaff].location = ja_flag;
		    sprintf(bufme,"%sModifier:%s %d %s\r\n",cy,gn,d->obj_edit->affected[d->iaff].modifier,nrm);
		    SEND_TO_Q(bufme,d);
		    sprintf(bufme,"Enter new modifier: ");
		    SEND_TO_Q(bufme,d);
		    d->oedit_mode = OAM_EDIT;
		    break;
		}
	    else{
		SEND_TO_Q("Illegal location.\r\n",d);
		d->ia_flag =  print_affs(d);
		break;
	    }
	}
	else if (*str == 'Q' || *str == 'q'){

	  sprintf(bufme,"%sModifier:%s %d %s\r\n",cy,gn,d->obj_edit->affected[d->iaff].modifier,nrm);
	  SEND_TO_Q(bufme,d);
	  sprintf(bufme,"Enter new modifier: ");
	  SEND_TO_Q(bufme,d);
	  d->oedit_mode = OAM_EDIT;
	  break;}
	else{
	    SEND_TO_Q("Illegal type.\r\n",d);
	    d->ia_flag =  print_types(d);
	    break;}
    case OAM_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = OA_EDIT;
	    sprintf(bufme,"%sModifier unchanged.\r\n\r\n%s",rd,nrm);
	    print_aff(d);
	    SEND_TO_Q(bufme,d);	    
	    return;}
	points = atoi(str);			
	if (points < -100 || points > 100){
	    SEND_TO_Q("\r\nIllegal modifier.\r\nEnter new modifier, >= -100, <= 100:",d);
	    break;
	}
	else{
	    d->obj_edit->affected[d->iaff].modifier = atoi(str);
	    d->oedit_mode = OA_EDIT;
	    print_aff(d);
	    return;}
    case OS_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = OS_EDIT;
	    print_stats(d);
	    break;}	    
	*str = LOWER(*str);
	if (*str != 't' && *str != 'w' && *str != 'v' && *str != 'c' && *str != 'q'){
	    SEND_TO_Q("No such stat.",d);
	    print_stats(d);
	    break;}
	switch(*str){
	case 't':
	    d->ia_flag = print_types(d);
	    d->oedit_mode = OET_EDIT;
	    return;
	case 'w':
	    sprintf(bufme,"%sWeight: %s%d\r\n",cy,gn,d->obj_edit->obj_flags.weight);
	    SEND_TO_Q(bufme,d);
	    sprintf(bufme,"%sEnter new obj weight:%s ",cy,gn);
	    SEND_TO_Q(bufme,d);	    
	    d->oedit_mode = OWE_EDIT;
	    return;	    
	case 'v':
	    sprintf(bufme,"%sValue: %s%d\r\n",cy,gn,d->obj_edit->obj_flags.cost);
	    SEND_TO_Q(bufme,d);
	    sprintf(bufme,"%sEnter new obj value (crowns*1000):%s ",cy,gn);
	    SEND_TO_Q(bufme,d);	    
	    d->oedit_mode = OC_EDIT;
	    return;	    
	case 'c':
	    sprintf(bufme,"%sCost/day: %s%d\r\n",cy,gn,d->obj_edit->obj_flags.cost_per_day);
	    SEND_TO_Q(bufme,d);
	    sprintf(bufme,"%sEnter new obj cost/day (crowns*1000):%s ",cy,gn);
	    SEND_TO_Q(bufme,d);	    
	    d->oedit_mode = OCD_EDIT;
	    return;	    
	case 'q':
	    d->oedit_mode = MAIN_MODE;
	    print_obj(d);
	    return;
	}
    case OCD_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = OS_EDIT;
	    sprintf(bufme,"%sCost/day unchanged.\r\n\r\n%s",rd,nrm);
	    print_stats(d);
	    SEND_TO_Q(bufme,d);	    
	    return;}
	points = atoi(str);			
	if (points < 0 || points > 1000000){
	    SEND_TO_Q("\r\nIllegal Cost/day.\r\nEnter new obj cost/day, >= 0, <= 1000000:",d);
	    break;
	}
	else{
	    d->obj_edit->obj_flags.cost_per_day = atoi(str);
	    d->oedit_mode = OS_EDIT;
	    print_stats(d);
	    return;}
    case OC_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = OS_EDIT;
	    sprintf(bufme,"%sValue unchanged.\r\n\r\n%s",rd,nrm);
	    print_stats(d);
	    SEND_TO_Q(bufme,d);	    
	    return;}
	points = atoi(str);			
	if (points < 0 || points > 1000000){
	    SEND_TO_Q("\r\nIllegal Value.\r\nEnter new obj value, >= 0, <= 1000000:",d);
	    break;
	}
	else{
	    d->obj_edit->obj_flags.cost = atoi(str);
	    d->oedit_mode = OS_EDIT;
	    print_stats(d);
	    return;}
    case OWE_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = OS_EDIT;
	    sprintf(bufme,"%sWeight unchanged.\r\n\r\n%s",rd,nrm);
	    print_stats(d);
	    SEND_TO_Q(bufme,d);	    
	    return;}
	points = atoi(str);			
	if (points < 0 || points > 100000){
	    SEND_TO_Q("\r\nIllegal weight.\r\nEnter new obj weight, >= 0, <= 100000:",d);
	    break;
	}
	else{
	    d->obj_edit->obj_flags.weight = atoi(str);
	    d->oedit_mode = OS_EDIT;
	    print_stats(d);
	    return;}
    case OF_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = OF_EDIT;
	    print_flags(d);
	    break;}	    
	*str = LOWER(*str);
	if (*str != 'w' && *str != 'e' && *str != 'a' && *str != 'q'){
	    SEND_TO_Q("No such flag.",d);
	    break;}
	switch(*str){
	case 'a':
	    if (GET_ITEM_TYPE(d->obj_edit) == ITEM_WAND ||
		GET_ITEM_TYPE(d->obj_edit) == ITEM_STAFF ||
		GET_ITEM_TYPE(d->obj_edit) == ITEM_TRASH){
		SEND_TO_Q("Sorry no affect bitvector allowed for this object type.\r\n",d);
		print_flags(d);
		return;
	    }	    
	    d->oedit_mode = OAFF_EDIT;
	    d->ia_flag = print_oaff(d);
	    return;
	case 'w':
	    d->oedit_mode = OW_EDIT;
	    d->ia_flag = print_owear(d);
	    return;
	case 'e':
	    d->oedit_mode = OEX_EDIT;
	    d->ia_flag = print_extras(d);
	    return;	    
	case 'q':
	    d->oedit_mode = MAIN_MODE;
	    print_obj(d);
	    return;
	}
    case OEX_EDIT:
	    for ( ; isspace(*str); str++)
		;
	if (!*str){
		d->oedit_mode = OEX_EDIT;
		print_extras(d);
		break;}
	if (is_number(str)){
	    ja_flag = atoi(str);
	    if (ja_flag >= 0 && ja_flag <= d->ia_flag )
		    {
			if (!IS_SET(d->obj_edit->obj_flags.extra_flags, 1<<ja_flag))
			    SET_BIT(d->obj_edit->obj_flags.extra_flags, 1<<ja_flag);
			else{
			    if ((1<<ja_flag) != ITEM_GODONLY)
				REMOVE_BIT(d->obj_edit->obj_flags.extra_flags, 1<<ja_flag);
			    else
				SEND_TO_Q("You are not holy enough to remove this flag.\r\n",d);
			}
			d->ia_flag =  print_extras(d);
			break;
			
		    }
	    else{
		SEND_TO_Q("Illegal Flag.\r\n",d);
		d->ia_flag =  print_extras(d);
		break;
	    }
	    }
	else if (*str == 'Q' || *str == 'q'){
	    print_flags(d);	
	    d->oedit_mode = OF_EDIT;
	    break;}
	else{
	    SEND_TO_Q("Illegal Flag.\r\n",d);
	    d->ia_flag =  print_extras(d);
	    break;}
    case OET_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = OET_EDIT;
	    print_types(d);
	    break;}
	if (is_number(str)){
	    ja_flag = atoi(str);
	    if (ja_flag >= 0 && ja_flag <= d->ia_flag )
		{
		  if (GET_ITEM_TYPE(d->obj_edit) != ja_flag){
		    GET_ITEM_TYPE(d->obj_edit) = ja_flag;
		    for (points=0;points<8;points++)
		      d->obj_edit->obj_flags.value[points] = 0;
		    d->obj_edit->obj_flags.extra_flags = 0;
		    d->obj_edit->obj_flags.bitvector = 0;
		    d->obj_edit->obj_flags.wear_flags = 0;
		    for (points = 0; points < MAX_OBJ_AFFECT; points++){
		      d->obj_edit->affected[points].location = 0;
		      d->obj_edit->affected[points].modifier = 0;
		    }
		  }
		  d->ia_flag =  print_types(d);
		  break;
		}
	    else{
		SEND_TO_Q("Illegal Flag.\r\n",d);
		d->ia_flag =  print_types(d);
		break;
	    }
	}
	else if (*str == 'Q' || *str == 'q'){
	    print_stats(d);	
	    d->oedit_mode = OS_EDIT;
	    break;}
	else{
	    SEND_TO_Q("Illegal type.\r\n",d);
	    d->ia_flag =  print_types(d);
	    break;}
    case OW_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = OW_EDIT;
	    print_owear(d);
	    break;}
	if (is_number(str)){
	    ja_flag = atoi(str);
	    if (ja_flag >= 0 && ja_flag <= d->ia_flag )
		{
		  if (!IS_SET(d->obj_edit->obj_flags.wear_flags, 1<<ja_flag))
		    SET_BIT(d->obj_edit->obj_flags.wear_flags, 1<<ja_flag);
		  else
		    REMOVE_BIT(d->obj_edit->obj_flags.wear_flags, 1<<ja_flag);
		  d->ia_flag =  print_owear(d);
		  break;
		}
	    else{
	      SEND_TO_Q("Illegal Flag.\r\n",d);
	      d->ia_flag =  print_owear(d);
	      break;
	    }
	}
	else if (*str == 'Q' || *str == 'q'){
	  print_flags(d);	
	    d->oedit_mode = OF_EDIT;
	    break;}
	else{
	    SEND_TO_Q("Illegal Flag.\r\n",d);
	    d->ia_flag =  print_owear(d);
	    break;}
    
    case OAFF_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = OAFF_EDIT;
	    print_oaff(d);
	    break;}
	if (is_number(str)){
	    ja_flag = atoi(str);
	    if (ja_flag >= 0 && ja_flag <= d->ia_flag )
		{
		    if (!IS_SET(d->obj_edit->obj_flags.bitvector, 1<<ja_flag))
			SET_BIT(d->obj_edit->obj_flags.bitvector, 1<<ja_flag);
		    else
			REMOVE_BIT(d->obj_edit->obj_flags.bitvector, 1<<ja_flag);
		    d->ia_flag =  print_oaff(d);
		    break;

		}
	    else{
		SEND_TO_Q("Illegal Flag.\r\n",d);
		d->ia_flag =  print_oaff(d);
		break;
	    }
	}
	else if (*str == 'Q' || *str == 'q'){
	    if (d->obj_edit->obj_flags.bitvector == 0){
		print_flags(d);	
		d->oedit_mode = OF_EDIT;
		break;}
	    else{
		sprintf(bufme,"Affect duration: %s%d%s\r\nNew Duration: ",
			cy,d->obj_edit->obj_flags2.aff_dur,nrm);
		SEND_TO_Q(bufme,d);
		d->oedit_mode = OAFDUR_EDIT;
		break;}
	    }
	else{
	    SEND_TO_Q("Illegal Flag.\r\n",d);
	    d->ia_flag =  print_oaff(d);
	    break;}
    case OAFDUR_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    SEND_TO_Q("Affect Duration unchanged.\r\n",d);
	    sprintf(bufme,"No Use duration: %s%d%s\r\nNew Duration: ",
			cy,d->obj_edit->obj_flags2.no_use_dur,nrm);
	    SEND_TO_Q(bufme
,d);
	    d->oedit_mode = ONUDUR_EDIT;
		break;}
	points = atoi(str);
	if (points < 1 || points > 14){
	    sprintf(bufme,"%sIllegal  duration%s: Range (1-14)\r\nNew Duration:",
		    rd,nrm);
	    SEND_TO_Q(bufme,d);
	    break;}
	else{
	    d->obj_edit->obj_flags2.aff_dur = points;
	     sprintf(bufme,"No Use duration: %s%d%s\r\nNew Duration: ",
			cy,d->obj_edit->obj_flags2.no_use_dur,nrm);
	    SEND_TO_Q(bufme,d);
	    d->oedit_mode = ONUDUR_EDIT;
	    break;}
    case ONUDUR_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    SEND_TO_Q("No Use Duration unchanged.\r\n",d);
	    d->obj_edit->obj_flags2.no_use_dur =
		2*d->obj_edit->obj_flags2.aff_dur;
	    print_flags(d);	
	    d->oedit_mode = OF_EDIT;
	    break;}
	points = atoi(str);
	if (points < 2*d->obj_edit->obj_flags2.aff_dur){
	    sprintf(bufme,"%sIllegal  duration%s: Range (>%d)\r\nNew Duration:",
		    rd,nrm, 2*d->obj_edit->obj_flags2.aff_dur);
	    SEND_TO_Q(bufme,d);
	    break;}
	else{
	    d->obj_edit->obj_flags2.no_use_dur = points;
	    print_flags(d);	
	    d->oedit_mode = OF_EDIT;	     
	    break;}
    case OSTR_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->oedit_mode = OSTR_EDIT;
	    print_ostr(d);
	    break;}	    
	*str = LOWER(*str);
	if (*str != 'n' && *str != 's' && *str != 'a' && *str != 'd' && *str != 'q'){
	    SEND_TO_Q("No such string.\r\n",d);
	    break;}
	switch(*str){
	case 'n':
	    d->str = &(d->obj_edit->name);
	    free(*d->str);
	    *d->str = 0;
	    d->max_str = 80;
	    SEND_TO_Q("Enter a new name list. No carriage return, terminate with a @@.\r\n",d);
	    return;
	case 's':
	    d->str = &(d->obj_edit->short_description);
	    free(*d->str);
	    *d->str = 0;
	    d->max_str = 80;
	    SEND_TO_Q("Enter a new short description. No carriage return, terminate with a @@.\r\n",d);
	    return;
	case 'a':
	    d->str = &(d->obj_edit->action_description);
	    free(*d->str);
	    *d->str = 0;
	    d->max_str = 80;
	    SEND_TO_Q("Enter a new action description. Carriage return at the end\r\n, terminate with a @@.\r\n",d);
	    return;
	case 'd':
	    d->str = &(d->obj_edit->description);
	    free(*d->str);
	    *d->str = 0;
	    d->max_str = 80;
	    SEND_TO_Q("Enter a new description. No carriage return at the end\r\n, terminate with a @@,\r\n",d);
	    return;
	case 'q':
	    d->oedit_mode = MAIN_MODE;
	    print_obj(d);
	    return;	    
	}

    }
}
void print_poisons(struct descriptor_data *d)
{
    char bufm[MAX_STRING_LENGTH];
    struct obj_data *j;


    j = d->obj_edit;
    sprintf(bufm,"Current Poison: %s%d%s\r\n\r\n",rd,j->obj_flags.value[7],nrm);
    sprintf(bufm,"%s%s0%s) Mild     1-12    pts per tic\r\n",bufm, bgn,nrm);
    sprintf(bufm,"%s%s1%s) Mild     6-24    pts per tic\r\n",bufm, yl,nrm);
    sprintf(bufm,"%s%s2%s) Moderate 12-48   pts per tic\r\n",bufm, yl,nrm);
    sprintf(bufm,"%s%s3%s) Strong   24-96   pts per tic\r\n",bufm, yl,nrm);
    sprintf(bufm,"%s%s4%s) V Strong 48-192  pts per tic\r\n",bufm, rd,nrm);
    sprintf(bufm,"%s%s5%s) Deadly   200-500 pts per tic\r\n",bufm, rd,nrm);
    SEND_TO_Q(bufm,d);
}
int print_drinks(struct descriptor_data *d)
{
    char bufm[MAX_STRING_LENGTH];
    struct obj_data *j;
    int i;

    j = d->obj_edit;
    i = j->obj_flags.value[2];
    sprintf(bufm ,"\r\n%sDrink Type:%s %s%s%s\r\n\r\n",cy,nrm,gn,drinks[i],nrm);
    SEND_TO_Q(bufm,d);
    i = 0;
    while (*drinks[i] != '\n')
	{
	    if (*drinks[i+1] != '\n') {
		sprintf(bufm,"[%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s \r\n",i,gn,drinks[i],nrm,i+1,gn,drinks[i+1],nrm);
		i +=2;}
	    else{
		sprintf(bufm,"[%2d]  %s%-15.15s%s\r\n",i,gn,drinks[i],nrm);
		i +=1;}
	    SEND_TO_Q(bufm,d);        
	}
    
    sprintf(bufm ,"\r\n%sEnter Drink Type or Q to quit.%s ",cy,nrm);
    SEND_TO_Q(bufm,d);
    return(i-1);

}
int print_cont_flags(struct descriptor_data *d)
{
    char bufm[MAX_STRING_LENGTH];
    char bufme[MAX_STRING_LENGTH];    
    struct obj_data *j;
    int i;
    
    j = d->obj_edit;
    
    sprintbit(j->obj_flags.value[1], container_bits, bufme);
    sprintf(bufm ,"\r\n%sAffected by Flags:%s %s%s%s\r\n\r\n",cy,nrm,gn,bufme,nrm);
    SEND_TO_Q(bufm,d);
    i = 0;
    while (*container_bits[i] != '\n')
	{
	    sprintf(bufm,"[%2d]  %s%-15.15s%s\r\n",i,gn,container_bits[i],nrm);
	    i +=1;
	    SEND_TO_Q(bufm,d);        
	}
    
    sprintf(bufm ,"\r\n%sEnter flag # to toggle or Q to quit.%s ",cy,nrm);
    SEND_TO_Q(bufm,d);
    return(i-1);

}
void print_osiz(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];    
    struct obj_data *j;
    int i;

    j = d->obj_edit;
    i = j->obj_flags.value[5];
    sprintf(bufme ,"\r\n%sObject is: %s%s%s\r\n\r\n",cy,gn, sizes[i],nrm);
    i = 0;
    while (*sizes[i] != '\n'){
	sprintf(bufme,"%s(%s%d%s) %s%s%s\r\n", bufme,cy,i,nrm,gn,sizes[i],nrm);
	i++;
    }
    SEND_TO_Q(bufme,d);
}
int print_odams(struct descriptor_data *d)
{
    char bufm[MAX_STRING_LENGTH];
    struct obj_data *j;
    int i;

    j = d->obj_edit;
    i = j->obj_flags.value[4];
    sprintf(bufm ,"\r\n%sObject is: %s%s%s\r\n\r\n",cy,gn,damage_state[i],nrm);
    SEND_TO_Q(bufm,d);
    
    i = 0;
    while (*damage_state[i] != '\n')
	{
	    sprintf(bufm,"[%2d]  %s%-15.15s%s\r\n",i,gn,damage_state[i],nrm);
	    SEND_TO_Q(bufm,d);        
	    i++;
	}
    
    sprintf(bufm ,"\r\n%sEnter damage state or Q to quit.%s ",cy,nrm);
    SEND_TO_Q(bufm,d);
    sprintf(bufm ,"\r\n%s-ve state == stunning condition.%s ",cy,nrm);
    SEND_TO_Q(bufm,d);
    return(i-1);
}
int print_weaps(struct descriptor_data *d)
{
    char bufm[MAX_STRING_LENGTH];
    struct obj_data *j;
    int i;

    j = d->obj_edit;
    i = j->obj_flags.value[3];
    sprintf(bufm ,"\r\n%sWeapon Type:%s %s%s%s\r\n\r\n",cy,nrm,gn,weapon_type[i],nrm);
    SEND_TO_Q(bufm,d);
    i = 0;
    while (*weapon_type[i] != '\n')
	{
	    if (*weapon_type[i+1] != '\n') {
		sprintf(bufm,"[%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s \r\n",i,gn,weapon_type[i],nrm,i+1,gn,weapon_type[i+1],nrm);
		i +=2;}
	    else{
		sprintf(bufm,"[%2d]  %s%-15.15s%s\r\n",i,gn,weapon_type[i],nrm);
		i +=1;}
	    SEND_TO_Q(bufm,d);        
	}
    
    sprintf(bufm ,"\r\n%sEnter Weapon Type or Q to quit.%s ",cy,nrm);
    SEND_TO_Q(bufm,d);
    return(i-1);

}

struct list_index_type *print_spells_n(struct descriptor_data *d, int ii, int type)
{
    char bufm[MAX_STRING_LENGTH],*spl;
    struct obj_data *j;
    struct list_index_type *list;

    int i;
    switch(type){
    case -3:
      list = Forms;
      break;
    case -2:
      list = Techs;
      break;
    case -1:
      list = TechForms;
      break;
    case CRIG_GUILD:
      list = CrIg;
      break;
    case CRAQ_GUILD:
      list = Water;
      break;
    case CRCO_GUILD:
      list = CrCo;
      break;
    case RECO_GUILD:
      list = ReCo;
      break;
    case MUCO_GUILD:
      list = MuCo;
      break;
    case RETE_GUILD:
      list = ReTe;
      break;
    case PECO_GUILD:
      list = PeCo;
      break;
    case PEIM_GUILD:
      list = PeIm;
      break;
    case INIM_GUILD:
      list = InIm;
      break;
    case CRAN_GUILD:
      list = Animal;
      break;
    default:
      SEND_TO_Q("Error in spell selection - report this\r\n",d);
      print_obj(d);
      d->oedit_mode = MAIN_MODE;
      return 0;
      break;
    }
    
    j = d->obj_edit;
    bzero(bufm,MAX_STRING_LENGTH);
    for (i = 0; *(list[i].entry) != '\n';i++) 
	sprintf(bufm, "%s[%s%3d%s]  %s%-40s%s\r\n",bufm,cy,list[i].index,nrm
		,gn,list[i].entry,nrm);
    SEND_TO_Q(bufm,d);
    spl = rev_search_list(j->obj_flags.value[ii], list);
    sprintf(bufm ,"\r\n\r\n%s%s:%s%s %s.%s ",cy,
	    ((type == -1) ? "Technique & Form" :
	     ((type == -2) ? "Technique" :
	      ((type == -3) ? "Form" :"Spell"))),nrm,gn
	    ,(spl? spl: "None Set") ,nrm);
    SEND_TO_Q(bufm,d);
    sprintf(bufm ,"\r\n%sEnter %s # or Q to quit.%s ",cy,
	    ((type == -1) ? "Technique & Form" :
	     ((type == -2) ? "Technique" :
	      ((type == -3) ? "Form" :"Spell"))),nrm,gn
	    ,(spl? spl: "None Set") ,nrm);

    SEND_TO_Q(bufm,d);
    return list;
}

int print_affs(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];
    char bufm[MAX_STRING_LENGTH];
    struct obj_data *j;
    int i;

    j = d->obj_edit;

    sprinttype(j->affected[d->iaff].location, apply_types, bufme);
    sprintf(bufm ,"\r\n%sAffect location:%s %s%s%s\r\n\r\n",cy,nrm,gn,bufme,nrm);
    SEND_TO_Q(bufm,d);
    i = 0;
    while (*apply_types[i] != '\n')
	{
	    if (*apply_types[i+2] != '\n' && *apply_types[i+1] != '\n' ){
		sprintf(bufm,"[%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s \r\n",i,gn,apply_types[i],nrm,i+1,gn,apply_types[i+1],nrm,i+2,gn,apply_types[i+2],nrm);
		i +=3;}
	    else if (*apply_types[i+1] != '\n') {
		sprintf(bufm,"[%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s \r\n",i,gn,apply_types[i],nrm,i+1,gn,apply_types[i+1],nrm);
		i +=2;}
	    else{
		sprintf(bufm,"[%2d]  %s%-15.15s%s\r\n",i,gn,apply_types[i],nrm);
		i +=1;}
	    SEND_TO_Q(bufm,d);        
	}
    
    sprintf(bufm ,"\r\n%sEnter location # or Q to quit.%s ",cy,nrm);
    SEND_TO_Q(bufm,d);
    return(i-1);

}
int print_oaff(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];
    char bufm[MAX_STRING_LENGTH];
    struct obj_data *j;
    int i;

    j = d->obj_edit;
    
    sprintbit(j->obj_flags.bitvector, affected_bits, bufme);
    sprintf(bufm ,"\r\n%sAffected by Flags:%s %s%s%s\r\n",cy,nrm,gn,bufme,nrm);
    SEND_TO_Q(bufm,d);
    sprintf(bufm, "Affect duration: %s%d%s, No-Use duration: %s%d%s\r\n\r\n",
	    cy,j->obj_flags2.aff_dur, nrm,cy,j->obj_flags2.no_use_dur,nrm);
    i = 0;
    while (*affected_bits[i] != '\n')
	{
	    if (*affected_bits[i+2] != '\n' && *affected_bits[i+1] != '\n' ){
		sprintf(bufm,"[%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s \r\n",i,gn,affected_bits[i],nrm,i+1,gn,affected_bits[i+1],nrm,i+2,gn,affected_bits[i+2],nrm);
		i +=3;}
	    else if (*affected_bits[i+1] != '\n') {
		sprintf(bufm,"[%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s \r\n",i,gn,affected_bits[i],nrm,i+1,gn,affected_bits[i+1],nrm);
		i +=2;}
	    else{
		sprintf(bufm,"[%2d]  %s%-15.15s%s\r\n",i,gn,affected_bits[i],nrm);
		i +=1;}
	    SEND_TO_Q(bufm,d);        
	}
    
    sprintf(bufm ,"\r\n%sEnter flag # to toggle or Q to quit.%s ",cy,nrm);
    SEND_TO_Q(bufm,d);
    return(i-1);

}
void print_stats(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];
    char bufm[MAX_STRING_LENGTH];    
    struct obj_data *j;
    
    j = d->obj_edit;
    sprintf(bufme,"%sStats:%s\r\n",cy,nrm);
    send_to_char(bufme,d->character);
    sprinttype(GET_ITEM_TYPE(j), item_types, bufm);
    sprintf(bufme,"Item (T)ype: %s%s%s, ",gn,bufm,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme, "(W)eight: %s%d%s, (V)alue: %s%d%s, (C)ost/day: %s%d%s.\r\n",
       gn,j->obj_flags.weight,nrm,gn,j->obj_flags.cost,nrm,
       gn,j->obj_flags.cost_per_day,nrm);
    send_to_char(bufme, d->character);
}
int print_types(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];
    char bufm[MAX_STRING_LENGTH];
    struct obj_data *j;
    int i;

    j = d->obj_edit;
    sprintf(bufme ,"\r\n%sWARNING changing item type will clear all values and flags!%s\r\n\r\n",brd,nrm);
    SEND_TO_Q(bufme,d);
    sprintf(bufme ,"%sPress Q to quit!%s\r\n\r\n",brd,nrm);
    SEND_TO_Q(bufme,d);
    sprinttype(GET_ITEM_TYPE(j), item_types, bufm);
    sprintf(bufme ,"\r\n%sType:%s %s%s%s\r\n\r\n",cy,nrm,gn,bufm,nrm);
    SEND_TO_Q(bufme,d);
    i = 0;
    while (*item_types[i] != '\n')
	{
	    if (*item_types[i+2] != '\n' && *item_types[i+1] != '\n'){
		sprintf(bufm,"[%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s \r\n",i,gn,item_types[i],nrm,i+1,gn,item_types[i+1],nrm,i+2,gn,item_types[i+2],nrm);
		i +=3;}
	    else if (*item_types[i+1] != '\n') {
		sprintf(bufm,"[%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s \r\n",i,gn,item_types[i],nrm,i+1,gn,item_types[i+1],nrm);
		i +=2;}
	    else{
		sprintf(bufm,"[%2d]  %s%-15.15s%s\r\n",i,gn,item_types[i],nrm);
		i +=1;}
	    SEND_TO_Q(bufm,d);        
	}
    
    sprintf(bufm ,"\r\n%sEnter Item type # or Q to quit.%s ",cy,nrm);
    SEND_TO_Q(bufm,d);
    return(i-1);

}
int print_extras(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];
    char bufm[MAX_STRING_LENGTH];
    struct obj_data *j;
    int i;

    j = d->obj_edit;
    
    sprintbit(j->obj_flags.extra_flags, extra_bits, bufme);
    sprintf(bufm ,"\r\n%sWorn:%s %s%s%s\r\n\r\n",cy,nrm,gn,bufme,nrm);
    SEND_TO_Q(bufm,d);
    i = 0;
    while (*extra_bits[i] != '\n')
	{
	    if (*extra_bits[i+2] != '\n' && *extra_bits[i+1] != '\n'){
		sprintf(bufm,"[%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s \r\n",i,gn,extra_bits[i],nrm,i+1,gn,extra_bits[i+1],nrm,i+2,gn,extra_bits[i+2],nrm);
		i +=3;}
	    else if (*extra_bits[i+1] != '\n') {
		sprintf(bufm,"[%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s \r\n",i,gn,extra_bits[i],nrm,i+1,gn,extra_bits[i+1],nrm);
		i +=2;}
	    else{
		sprintf(bufm,"[%2d]  %s%-15.15s%s\r\n",i,gn,extra_bits[i],nrm);
		i +=1;}
	    SEND_TO_Q(bufm,d);        
	}
    
    sprintf(bufm ,"\r\n%sEnter flag # to toggle or Q to quit.%s ",cy,nrm);
    SEND_TO_Q(bufm,d);
    return(i-1);

}
int print_owear(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];
    char bufm[MAX_STRING_LENGTH];
    struct obj_data *j;
    int i;

    j = d->obj_edit;
    
    sprintbit(j->obj_flags.wear_flags, wear_bits, bufme);
    sprintf(bufm ,"\r\n%sWorn:%s %s%s%s\r\n\r\n",cy,nrm,gn,bufme,nrm);
    SEND_TO_Q(bufm,d);
    i = 0;
    while (*wear_bits[i] != '\n')
	{
	    if (*wear_bits[i+2] != '\n' && *wear_bits[i+1] != '\n'){
		sprintf(bufm,"[%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s \r\n",i,gn,wear_bits[i],nrm,i+1,gn,wear_bits[i+1],nrm,i+2,gn,wear_bits[i+2],nrm);
		i +=3;}
	    else if (*wear_bits[i+1] != '\n') {
		sprintf(bufm,"[%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s \r\n",i,gn,wear_bits[i],nrm,i+1,gn,wear_bits[i+1],nrm);
		i +=2;}
	    else{
		sprintf(bufm,"[%2d]  %s%-15.15s%s\r\n",i,gn,wear_bits[i],nrm);
		i +=1;}
	    SEND_TO_Q(bufm,d);        
	}
    
    sprintf(bufm ,"\r\n%sEnter flag # to toggle or Q to quit.%s ",cy,nrm);
    SEND_TO_Q(bufm,d);
    return(i-1);

}

void print_flags(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];
    char bufm[MAX_STRING_LENGTH];    
    struct obj_data *j;
    
    j = d->obj_edit;
    
    sprintf(bufme,"%sFlags:%s\r\n",cy,nrm);
    send_to_char(bufme,d->character);

    sprintbit(j->obj_flags.wear_flags, wear_bits, bufm);
    sprintf(bufme,"(W) Worn: %s%s%s\r\n",gn,bufm,nrm);
    send_to_char(bufme,d->character);                
    sprintbit(j->obj_flags.bitvector, affected_bits, bufm);
    sprintf(bufme,"(A) Apply: %s%s%s\r\n",gn,bufm,nrm);
    send_to_char(bufme,d->character);                
    sprintbit(j->obj_flags.extra_flags, extra_bits, bufm);
    sprintf(bufme,"(E) Extra Flags: %s%s%s\r\n",gn,bufm,nrm);    
    send_to_char(bufme,d->character);            	


}
void print_aff(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];
    char bufm[MAX_STRING_LENGTH];    
    struct obj_data *j;
    int i;
    
    j = d->obj_edit;
    
    send_to_char(cy, d->character);
    send_to_char("Affections:\r\n", d->character);

    for (i = 0; i < MAX_OBJ_AFFECT; i++)
	if (j->affected[i].modifier) {
	    sprinttype(j->affected[i].location, apply_types, bufm);
	    sprintf(bufme, "%s(%d)%s %+d to %s ",nrm,i,gn,j->affected[i].modifier, bufm);
	    send_to_char(bufme, d->character);
	}
	else {
	    sprintf(bufme, "%s(%d)%s +0 to <none> ",nrm,i,gn);
	    send_to_char(bufme, d->character);}
    
    send_to_char(nrm,d->character);
    send_to_char("\r\nSelect number of affect to modify:",d->character);
}
void print_ostr(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];
    struct obj_data *j;
    
    j = d->obj_edit;
    
    sprintf(bufme,"%sDescriptions:%s\r\n",cy,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"%s(N) Name:%s %s%s%s,  ",cy,nrm,wh,j->name,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"%s(S) Short Descr:%s %s%s%s\r\n",cy,nrm,wh,
	    ((j->short_description) ? j->short_description: "<None>"),nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"%s(D) Description:%s%s%s\r\n",cy,wh,
	    ((j->description) ? j->description: "<None>"),nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"%s(A) Action Description:%s %s%s%s\r\n",cy,nrm,wh,
	    ((j->action_description) ? j->action_description: "<None>"),nrm);
    send_to_char(bufme,d->character);            

}
void print_exd(struct descriptor_data *d)
{
    struct obj_data *j;
    char bufme[MAX_STRING_LENGTH];
    struct extra_descr_data *desc=0;
    int i =0;
    
    j = d->obj_edit;

    desc = j->ex_description;
    while(i < d->iedsc && desc->next){
	desc = desc->next;
	++i;}
    SEND_TO_Q(cy,d);
    SEND_TO_Q("Extra Desc:\r\n",d);
    SEND_TO_Q(nrm,d);
    sprintf(bufme,"(K) Keywords:%s %s%s\r\n",gn,((desc->keyword) ? desc->keyword : "None") ,nrm);
    SEND_TO_Q(bufme,d);
    sprintf(bufme,"(D) Description:%s \r\n%s%s\r\n",gn,((desc->description) ? desc->description : "None"),nrm);
    SEND_TO_Q(bufme,d);
    sprintf(bufme,"(%sP%s) Purge\r\n",rd,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"(Q) Quit.\r\n");
    SEND_TO_Q(bufme,d);
}

int print_ex(struct descriptor_data *d)
{
    struct obj_data *j;
    char bufme[MAX_STRING_LENGTH];
    struct extra_descr_data *desc=0;
    int i =0;
    
    j = d->obj_edit;
    
    send_to_char("Extra Desc:\r\n", d->character);
    send_to_char(yl,d->character);
    *bufme = '\0';
    if (j->ex_description)
	for (desc = j->ex_description; desc; desc = desc->next){
	    sprintf(bufme,"(%d) %s\r\n",i,desc->keyword);
	    i++;
	    send_to_char(bufme,d->character);
	}
    send_to_char("(C) Create new extra description.\r\n",d->character);
    send_to_char("(Q) Quit.\r\n",d->character);    
    send_to_char(nrm,d->character);
    return(i);
}

void print_obj(struct descriptor_data *d)

{
    int i;
    struct obj_data *j;
    char bufme[MAX_STRING_LENGTH];
    char bufm[MAX_STRING_LENGTH];
    struct extra_descr_data *desc=0;
    

    j = d->obj_edit;
    
    sprintf(cy,"%s",CCBBLU(d->character,C_NRM));
    sprintf(wh,"%s",CCWHT(d->character,C_NRM));
    sprintf(ma,"%s",CCMAG(d->character,C_NRM));
    sprintf(nrm,"%s",CCNRM(d->character,C_NRM));
    sprintf(gn,"%s",CCGRN(d->character,C_NRM));
    sprintf(yl,"%s",CCYEL(d->character,C_NRM));
    sprintf(rd,"%s",CCRED(d->character,C_NRM));                
    sprintf(bgn,"%s",CCGRN(d->character,C_NRM));
    sprintf(byl,"%s",CCBYEL(d->character,C_NRM));
    sprintf(brd,"%s",CCBRED(d->character,C_NRM));
    
    sprintf(bufme,"%sObj Number: %d%s, %sCreation Points: %s%d%s\r\n",cy,d->virtual,nrm,byl,brd,assess_item(j),nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"(%sT%s)ext:\r\n",cy,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"Name: %s%s%s  ",wh,j->name,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"Short Descr: %s%s%s\r\n",wh,
	    ((j->short_description) ? j->short_description: "<None>"),nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"Description: %s%s%s\r\n",wh,
	    ((j->description) ? j->description: "<None>"),nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"Action Description: %s%s%s\r\n",wh,
	    ((j->action_description) ? j->action_description: "<None>"),nrm);
    send_to_char(bufme,d->character);            

    sprintf(bufme,"(%sF%s)lags:\r\n",cy,nrm);
    send_to_char(bufme,d->character);

    sprintbit(j->obj_flags.wear_flags, wear_bits, bufm);
    sprintf(bufme,"Worn: %s%s%s\r\n",gn,bufm,nrm);
    send_to_char(bufme,d->character);                
    sprintbit(j->obj_flags.bitvector, affected_bits, bufm);
    sprintf(bufme,"Apply: %s%s%s\r\n",gn,bufm,nrm);
    send_to_char(bufme,d->character);
    if (j->obj_flags.bitvector){
	sprintf(bufme,"Aff time: %s%d%s, No Use time: %s%d%s\r\n",gn,j->obj_flags2.aff_dur,nrm, rd,j->obj_flags2.no_use_dur,nrm);
	send_to_char(bufme,d->character);
    }
    sprintbit(j->obj_flags.extra_flags, extra_bits, bufm);
    sprintf(bufme,"Extra Flags: %s%s%s\r\n",gn,bufm,nrm);    
    send_to_char(bufme,d->character);            	

    sprintf(bufme,"(%sS%s)tats:\r\n",cy,nrm);
    send_to_char(bufme,d->character);
    sprinttype(GET_ITEM_TYPE(j), item_types, bufm);
    sprintf(bufme,"Item Type: %s%s%s, ",gn,bufm,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme, "Weight: %s%d%s, Value: %s%d%s, Cost/day: %s%d%s.\r\n",
       gn,j->obj_flags.weight,nrm,gn,j->obj_flags.cost,nrm,
       gn,j->obj_flags.cost_per_day,nrm);
    send_to_char(bufme, d->character);
    sprintf(bufme,"(%sI%s)llumination: %s%d%s\r\n",cy,nrm,gn,j->obj_flags2.light, nrm);
    send_to_char(bufme, d->character);
    sprintf(bufme,"(%sV%s)alues: %s%d %d %d %d %d%s\r\n",cy,nrm,gn,
	j->obj_flags.value[0],
	j->obj_flags.value[1],	    
	j->obj_flags.value[2],
	j->obj_flags.value[3],
	j->obj_flags.value[7],cy);
    send_to_char(bufme,d->character);
    sprintf(bufme,"(%sD%s)am state: %s%s%s, si(%sZ%s)e: %s%s%s\r\n",
	    cy,nrm,gn,damage_state[j->obj_flags.value[4]],nrm,cy,nrm,gn,
	    sizes[j->obj_flags.value[5]],nrm);
    send_to_char(bufme, d->character);
    sprintf(bufme,"Item (%sL%s)imit: %s%d%s\r\n",cy,nrm,yl
	    ,j->obj_flags.value[6],nrm);
    send_to_char(bufme, d->character);
    sprintf(bufme,"(%sA%s)ffections:\r\n",cy,nrm);
    send_to_char(bufme, d->character);
    for (i = 0; i < MAX_OBJ_AFFECT; i++)
	if (j->affected[i].modifier) {
	    sprinttype(j->affected[i].location, apply_types, bufm);
	    sprintf(bufme, "%s(%d)%s %+d to %s ",nrm,i,gn,
		    j->affected[i].modifier, bufm);
	    send_to_char(bufme, d->character);
	}
    	else {
	    sprintf(bufme, "%s(%d)%s  +0 to <none> ",nrm,i,gn);
	    send_to_char(bufme, d->character);}

    sprintf(bufme,"%s\r\n(%sE%s) Extra Desc:\r\n%s",nrm,cy,nrm,yl);
    send_to_char(bufme,d->character);
    if (j->ex_description)
	for (desc = j->ex_description; desc; desc = desc->next){
	    SEND_TO_Q(desc->keyword,d);
	    if (desc->next)
		SEND_TO_Q(", ",d);}
    else
	    SEND_TO_Q("<None Set>",d);

    sprintf(bufme,".%s\r\n",nrm);    
    send_to_char(bufme,d->character);
}

int calc_min_level_scpo(struct descriptor_data *d)
{
 int i,il,level;

 level = 0;
 for (i = 1;i<3;i++){
     il = d->obj_edit->obj_flags.value[i];
     if (spell_info[il].min_level > level)
	 level =  spell_info[il].min_level;
 }
 return(level);
}

int is_goditem(struct obj_data *j)
{
    int tohitdam = 0, points = 0, i;
    
    switch(GET_ITEM_TYPE(j)){
    case ITEM_WEAPON:
	if ((j->obj_flags.value[1]*j->obj_flags.value[2] 
	     > j->obj_flags.weight/7)
	    || (j->obj_flags.value[1] > j->obj_flags.weight/15))
	    return TRUE;
	for (i = 0; i < MAX_OBJ_AFFECT; i++)
	    if (j->affected[i].modifier) {
		switch (j->affected[i].location){
		case APPLY_HITROLL:
		case APPLY_HITROLL2:		  
		case APPLY_DAMROLL:
		case APPLY_DAMROLL2:		  
		    tohitdam += j->affected[i].modifier;
		}
	    }
	if (tohitdam > 7)
	    return(TRUE);
    case ITEM_CONTAINER:
	if ((j->obj_flags.value[0] - j->obj_flags.weight) > 4000) 
	    return TRUE;
	break;
    default:
	break;
    }
    points = assess_item(j);
    if (points > 125)
	return(TRUE);
    else
	{
            if(points <= 20)
                return (FALSE);
	    if(j->obj_flags.cost < points*100)
		return(TRUE);
	    if(j->obj_flags.cost_per_day < points*10) 
		return(TRUE);
	    return FALSE;
	}    
    
}
int assess_item(struct obj_data *j)
{
  int i, totpoints = 0;

  switch(GET_ITEM_TYPE(j)){
  case ITEM_WEAPON:
    totpoints = (j->obj_flags.value[1]*j->obj_flags.value[2] 
		 + j->obj_flags.value[1]) * 2;
    break;
  case ITEM_VIS:
    if (j->obj_flags.value[1] > 0)
    totpoints = 15*j->obj_flags.value[3];
    if (j->obj_flags.value[2] > 0)
    totpoints += 15*j->obj_flags.value[3];
    break;
  case ITEM_ARMOR:
    if(j->obj_flags.value[0] > 0)
      totpoints += j->obj_flags.value[0] * 2;
    else
      totpoints += j->obj_flags.value[0];
    if(j->obj_flags.value[1] > 0)
      totpoints += j->obj_flags.value[1] * 15;
    else
      totpoints += j->obj_flags.value[1] * 5;
    break;
  default:
    break;
  }
  for (i = 0; i < MAX_OBJ_AFFECT; i++)
    if (j->affected[i].modifier) {
      switch (j->affected[i].location){
      case APPLY_HITROLL:
      case APPLY_DAMROLL:
      case APPLY_HITROLL2:
      case APPLY_DAMROLL2:	      
	if(j->affected[i].modifier > 0)
	  totpoints += j->affected[i].modifier * 12;
	else
	  totpoints += j->affected[i].modifier * 4;
	break;
      case APPLY_STR:
      case APPLY_DEX:
      case APPLY_INT:
      case APPLY_WIS:
      case APPLY_CON:
      case APPLY_FOCUS:
	if(j->affected[i].modifier > 0)
	  totpoints += j->affected[i].modifier * 20; else
	    totpoints += j->affected[i].modifier * 10;
	break;
      case APPLY_PER:
      case APPLY_GUI:
      case APPLY_CHR:
      case APPLY_LUC:
	if(j->affected[i].modifier > 0)
	  totpoints += j->affected[i].modifier * 20; else
	    totpoints += j->affected[i].modifier * 2;
	break;
      case APPLY_DEVOTION:
      case APPLY_MANA:
      case APPLY_POWER:
	break;
      case APPLY_MOVE:
      case APPLY_HIT:
	if(j->affected[i].modifier > 0)
	  totpoints += j->affected[i].modifier * 3; else
	    totpoints += j->affected[i].modifier;
	break;
      case APPLY_AC:
      case APPLY_LEGS_AC:
      case APPLY_ARMS_AC:
      case APPLY_HEAD_AC:
	if(j->affected[i].modifier < 0)
	  totpoints -= j->affected[i].modifier * 2; else
	    totpoints -= j->affected[i].modifier;
	break;
      case APPLY_ALL_AC:
	if(j->affected[i].modifier < 0)
	  totpoints -= j->affected[i].modifier * 15; else
	    totpoints -= j->affected[i].modifier * 5;
	break;
      case APPLY_BODY_STOPPING:
      case APPLY_LEGS_STOPPING:
      case APPLY_ARMS_STOPPING:
      case APPLY_HEAD_STOPPING:
	if(j->affected[i].modifier > 0)
	  totpoints += j->affected[i].modifier * 15; else
	    totpoints += j->affected[i].modifier * 5;
	break;
      case APPLY_ALL_STOPPING:
	if(j->affected[i].modifier > 0)
	  totpoints += j->affected[i].modifier * 60; else
	    totpoints += j->affected[i].modifier * 20;
	break;
      case APPLY_SAVING_PARA:
      case APPLY_SAVING_ROD:
      case APPLY_SAVING_PETRI:
      case APPLY_SAVING_BREATH:
      case APPLY_SAVING_SPELL:
	if(j->affected[i].modifier < 0)
	  totpoints -= j->affected[i].modifier * 7; else
	    totpoints -= j->affected[i].modifier * 2;
	break;
      case APPLY_ALL_SAVE:
	if(j->affected[i].modifier < 0)
	  totpoints -= j->affected[i].modifier * 20; else
	    totpoints -= j->affected[i].modifier * 7;
	break;
      }
    }

  if(j->obj_flags.bitvector & AFF_BLIND)
    totpoints += -20;
  if(j->obj_flags.bitvector & AFF_INVISIBLE) 
    totpoints += 50;
  if(j->obj_flags.bitvector & AFF_DETECT_EVIL) 
    totpoints += 50;
  if(j->obj_flags.bitvector & AFF_DETECT_INVISIBLE) 
    totpoints += 40;
  if(j->obj_flags.bitvector & AFF_DETECT_MAGIC) 
    totpoints += 50;
  if(j->obj_flags.bitvector & AFF_SENSE_LIFE) 
    totpoints += 50;
  if(j->obj_flags.bitvector & AFF_SANCTUARY) 
    totpoints += 200;
  if(j->obj_flags.bitvector & AFF_CURSE)
    totpoints += -30;
  if(j->obj_flags.bitvector & AFF_PROTECT_EVIL) 
    totpoints += 50;
  if(j->obj_flags.bitvector & AFF_PARALYSIS) 
    totpoints += -25;
  if(j->obj_flags.bitvector & AFF_RESIST_HEAT) 
    totpoints += 60;
  if(j->obj_flags.bitvector & AFF_RESIST_COLD) 
    totpoints += 60;
  if(j->obj_flags.bitvector & AFF_SLEEP)
    totpoints += -25;
  if(j->obj_flags.bitvector & AFF_SNEAK)
    totpoints += 150;
  if(j->obj_flags.bitvector & AFF_HIDE)
    totpoints += 150;
  if(j->obj_flags.bitvector & AFF_INFRARED) 
    totpoints += 60;
  if(j->obj_flags.bitvector & AFF_FLY)
    totpoints += 75;
  if(j->obj_flags.bitvector & AFF_WATER_BREATH) 
    totpoints += 100;
  if(j->obj_flags.bitvector & AFF_FREE_ACTION) 
    totpoints += 100;

  if(j->obj_flags.extra_flags & ITEM_FRAGILE) 
    totpoints += -20;
  if ((j->obj_flags.extra_flags & ITEM_MAGIC)
      && GET_ITEM_TYPE(j) == ITEM_LIGHT)
    totpoints += (j->obj_flags.value[2]*3/4);
  if ((j->obj_flags.extra_flags & ITEM_MAGIC)
      && (j->obj_flags.extra_flags & ITEM_GLOW))
    totpoints +=(4*abs(j->obj_flags2.light));    
  if(j->obj_flags.extra_flags & ITEM_NORENT)
    totpoints += -30;

  return(totpoints);


}