/* ************************************************************************ * 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); }