/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" #include "build.h" OBJ_INDEX_DATA * obj_index_hash [MAX_KEY_HASH]; int top_obj_index; void oedit_create_object(CHAR_DATA *ch, char *argument) { OBJ_INDEX_DATA *pObjIndex; int vnum=0; int iHash; char vnum_store[MAX_INPUT_LENGTH]; argument = one_argument( argument, vnum_store ); if ((is_number(vnum_store))==FALSE) { send_to_char("Syntax : oedit create <vnum>\n\r", ch); return; }; vnum = atoi( vnum_store ); if ( ( pObjIndex = get_obj_index( vnum ) ) != NULL ) { send_to_char( "Error : An item with that vnum already exists.\n\r", ch ); return; }; pObjIndex = alloc_perm( sizeof(*pObjIndex) ); pObjIndex->vnum = vnum; pObjIndex->name = str_dup("ball of prot-plasm"); pObjIndex->short_descr = str_dup("ball of prot-plasm"); pObjIndex->description = str_dup("ball of prot-plasm."); /* Action description default setting;*/ pObjIndex->short_descr[0] = LOWER(pObjIndex->short_descr[0]); pObjIndex->description[0] = UPPER(pObjIndex->description[0]); pObjIndex->item_type = ITEM_TRASH; pObjIndex->extra_flags = 0; pObjIndex->wear_flags = -1; pObjIndex->value[0] = 0; pObjIndex->value[1] = 0; pObjIndex->value[2] = 0; pObjIndex->value[3] = 0; pObjIndex->weight = 1; pObjIndex->cost = 1; /* Unused */ iHash = vnum % MAX_KEY_HASH; pObjIndex->next = obj_index_hash[iHash]; obj_index_hash[iHash] = pObjIndex; top_obj_index++; ch->builder_mode = MODE_OEDIT; ch->builder_vnum = vnum; oedit_load(ch, vnum); send_to_char("Object Editor Mode Started.\n\rObject Created.\n\r", ch); return; }; void oedit_show( CHAR_DATA *ch, char *argument ) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; AFFECT_DATA *paf; OBJ_DATA *obj; OBJ_INDEX_DATA *pObjIndex; one_argument( argument, arg ); if ( ch->builder_mode == MODE_OEDIT && arg[0] == '\0' ) { if ( ( pObjIndex = get_obj_index( ch->builder_vnum ) ) == NULL ) { send_to_char( "OEDIT: No object has that vnum.\n\r", ch ); return; } if ( ( obj = get_obj_vnum( ch, pObjIndex->vnum ) ) == NULL ) { send_to_char( "OEDIT: that item is currently not load in the game.\n\r", ch ); return; } } else { if (arg[0] == '\0' ) { send_to_char( "Show which object?\n\r", ch ); return; } if ( is_number( arg) == TRUE ) { if ( ( obj = get_obj_vnum( ch, atoi( arg ) ) ) == NULL ) { send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch ); return; } } else { if ( ( obj = get_obj_world( ch, arg ) ) == NULL ) { send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch ); return; } } } sprintf( buf, "Name: %s.\n\r",obj->name ); send_to_char( buf, ch ); sprintf( buf, "Vnum: %d. Type: %s.\n\r", obj->pIndexData->vnum, item_type_name( obj ) ); send_to_char( buf, ch ); sprintf( buf, "Short description: %s.\n\rLong description: %s\n\r", obj->short_descr, obj->description ); send_to_char( buf, ch ); sprintf( buf, "Wear bits: %d. Extra bits: %s.\n\r", obj->wear_flags, extra_bit_name( obj->extra_flags ) ); send_to_char( buf, ch ); sprintf( buf, "Number: %d/%d. Weight: %d/%d.\n\r", 1, get_obj_number( obj ), obj->weight, get_obj_weight( obj ) ); send_to_char( buf, ch ); sprintf( buf, "Cost: %d. Timer: %d. Level: %d.\n\r", obj->cost, obj->timer, obj->level ); send_to_char( buf, ch ); sprintf( buf, "In room: %d. In object: %s. Carried by: %s. Wear_loc: %d.\n\r", obj->in_room == NULL ? 0 : obj->in_room->vnum, obj->in_obj == NULL ? "(none)" : obj->in_obj->short_descr, obj->carried_by == NULL ? "(none)" : obj->carried_by->name, obj->wear_loc ); send_to_char( buf, ch ); sprintf( buf, "Values: %d %d %d %d.\n\r", obj->value[0], obj->value[1], obj->value[2], obj->value[3] ); send_to_char( buf, ch ); if ( obj->extra_descr != NULL || obj->pIndexData->extra_descr != NULL ) { EXTRA_DESCR_DATA *ed; send_to_char( "Extra description keywords: '", ch ); for ( ed = obj->extra_descr; ed != NULL; ed = ed->next ) { send_to_char( ed->keyword, ch ); if ( ed->next != NULL ) send_to_char( " ", ch ); } for ( ed = obj->pIndexData->extra_descr; ed != NULL; ed = ed->next ) { send_to_char( ed->keyword, ch ); if ( ed->next != NULL ) send_to_char( " ", ch ); } send_to_char( "'.\n\r", ch ); } for ( paf = obj->affected; paf != NULL; paf = paf->next ) { sprintf( buf, "Affects %s by %d.\n\r", affect_loc_name( paf->location ), paf->modifier ); send_to_char( buf, ch ); } for ( paf = obj->pIndexData->affected; paf != NULL; paf = paf->next ) { sprintf( buf, "Affects %s by %d.\n\r", affect_loc_name( paf->location ), paf->modifier ); send_to_char( buf, ch ); } return; } void oedit_load( CHAR_DATA *ch, int argument ) { OBJ_INDEX_DATA *pObjIndex; OBJ_DATA *obj; if ( ( pObjIndex = get_obj_index( argument ) ) == NULL ) { send_to_char("OEDIT : ERROR it is not possible to create this item. \n\r",ch); return; } obj = create_object( pObjIndex, 1 ); /* chage this to the mortal level :) */ if ( CAN_WEAR(obj, ITEM_TAKE) ) { obj_to_char( obj, ch ); } else { obj_to_room( obj, ch->in_room ); act( "$n has created $p!", ch, obj, NULL, TO_ROOM ); } return; }; void oedit_load_object( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; OBJ_INDEX_DATA *pObjIndex; int vnum; argument = one_argument( argument, arg ); if (!is_number(arg)) { send_to_char("Syntax : oedit load <vnum>\n\r", ch); return; }; vnum = atoi( arg ); if ( ( pObjIndex = get_obj_index( vnum ) ) == NULL ) { send_to_char( "OEDIT : No object with that vnum exists.\n\r", ch); return; }; oedit_load(ch, vnum); send_to_char("Object Loaded.\n\r", ch); return; }; void oedit_weight( CHAR_DATA *ch, char *argument ) { char arg1 [MAX_INPUT_LENGTH]; int value; OBJ_DATA *obj; OBJ_INDEX_DATA *pObjIndex; argument = one_argument( argument, arg1 ); value = atoi( arg1 ); if ( ch->builder_mode != MODE_OEDIT ) { send_to_char("OEDIT: But you are not editing an object?\n\r", ch); return; } if ( is_number( arg1 ) ) { if ( ( pObjIndex = get_obj_index( ch->builder_vnum ) ) == NULL ) { send_to_char( "OEDIT: No object has that vnum.\n\r", ch ); return; } if ( ( obj = get_obj_vnum( ch, ch->builder_vnum/* pObjIndex->vnum */ ) ) == NULL ) { send_to_char( "OEDIT: that item is currently not load in the game.\n\r", ch ); return; } obj->weight = value; pObjIndex->weight = value; send_to_char("Weight Changed.\n\r", ch); return; } else { send_to_char("Syntax : oedit weight <value>\n\r", ch); return; } return; }; void oedit_timmer( CHAR_DATA *ch, char *argument ) { char arg1 [MAX_INPUT_LENGTH]; int value; OBJ_DATA *obj; OBJ_INDEX_DATA *pObjIndex; argument = one_argument( argument, arg1 ); value = atoi( arg1 ); if ( ch->builder_mode != MODE_OEDIT ) { send_to_char("OEDIT: But you are not editing an object?\n\r", ch); return; } if ( is_number( arg1 ) ) { if ( ( pObjIndex = get_obj_index( ch->builder_vnum ) ) == NULL ) { send_to_char( "OEDIT: No object has that vnum.\n\r", ch ); return; } if ( ( obj = get_obj_vnum( ch, pObjIndex->vnum ) ) == NULL ) { send_to_char( "OEDIT: that item is currently not load in the game.\n\r", ch ); return; } obj->timer = value; pObjIndex->count = value; send_to_char("Timmer Changed.\n\r", ch); return; } else { send_to_char("Syntax : oedit timmer <value>\n\r", ch); return; } return; }; void oedit_select( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; OBJ_DATA *obj; one_argument( argument, arg ); if (arg[0] == '\0' ) { send_to_char( "OEDIT: Edit which object?\n\r", ch ); return; } if ( is_number( arg ) ) { if ( ( obj = get_obj_vnum( ch, atoi( arg ) ) ) == NULL ) { send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch); return; } } else { if ( ( obj = get_obj_world( ch, arg ) ) == NULL ) { send_to_char( "OEDIT: That object is not currently in the game.\n\r", ch); return; } } ch->builder_mode = MODE_OEDIT; ch->builder_vnum= atoi( arg ); send_to_char("Object Editor Mode Started.\n\rObject Selected.\n\r", ch); return; } void oedit_affects( CHAR_DATA *ch, char *argument ) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; OBJ_DATA *obj; OBJ_INDEX_DATA *pObjIndex; one_argument( argument, arg1 ); one_argument( argument, arg2 ); if ( ch->builder_mode != MODE_OEDIT || arg2[0] == '\0' ) { send_to_char( "OEDIT: But you are not editing an object ?\n\r", ch ); return; } if ( ( pObjIndex = get_obj_index( ch->builder_vnum ) ) == NULL ) { send_to_char( "OEDIT: No object has that vnum.\n\r", ch ); return; } if ( ( obj = get_obj_vnum( ch, pObjIndex->vnum ) ) == NULL ) { send_to_char( "OEDIT: that item is currently not load in the game.\n\r", ch); return; } if (arg1[0] == '\0' ) { send_to_char( "Syntax: oedit affect <field> <value>\n\r", ch ); send_to_char( "Where Field Is :\n\r", ch ); send_to_char( "str dex wis con int mana move ac hitroll damroll\n\r", ch ); send_to_char( "closeable closed locked pickproof\n\r", ch ); return; } if ( !str_cmp( arg1 , "str" ) ) { if (!is_number( arg2 )) /* logic statement wrong ??? */ { AFFECT_DATA *paf; for ( paf = obj->affected; paf != NULL; paf = paf->next ) { send_to_char("Object affects: - \n\r", ch); sprintf(buf, "type : %d\n\r", paf->type); send_to_char(buf, ch); sprintf(buf, "duration : %d\n\r", paf->duration); send_to_char(buf, ch); sprintf(buf, "location : %d\n\r", paf->location); send_to_char(buf, ch); sprintf(buf, "modifier : %d\n\r", paf->modifier); send_to_char(buf, ch); return; } /* paf = alloc_perm( sizeof(*paf) ); paf->type = -1; paf->duration = -1; paf->location = ; paf->modifier = ; paf->bitvector = 0; paf->next = pObjIndex->affected; pObjIndex->affected = paf;*/ } else { send_to_char( "Syntax: oedit affect str <value>\n\r", ch ); return; } } return; } /* * Return ascii name of extra flags vector. char *extra_bit_name( int extra_flags ) { static char buf[512]; buf[0] = '\0'; if ( extra_flags & ITEM_GLOW ) strcat( buf, " glow" ); if ( extra_flags & ITEM_HUM ) strcat( buf, " hum" ); if ( extra_flags & ITEM_DARK ) strcat( buf, " dark" ); if ( extra_flags & ITEM_LOCK ) strcat( buf, " lock" ); if ( extra_flags & ITEM_EVIL ) strcat( buf, " evil" ); if ( extra_flags & ITEM_INVIS ) strcat( buf, " invis" ); if ( extra_flags & ITEM_MAGIC ) strcat( buf, " magic" ); if ( extra_flags & ITEM_NODROP ) strcat( buf, " nodrop" ); if ( extra_flags & ITEM_BLESS ) strcat( buf, " bless" ); if ( extra_flags & ITEM_ANTI_GOOD ) strcat( buf, " anti-good" ); if ( extra_flags & ITEM_ANTI_EVIL ) strcat( buf, " anti-evil" ); if ( extra_flags & ITEM_ANTI_NEUTRAL ) strcat( buf, " anti-neutral" ); if ( extra_flags & ITEM_NOREMOVE ) strcat( buf, " noremove" ); if ( extra_flags & ITEM_INVENTORY ) strcat( buf, " inventory" ); return ( buf[0] != '\0' ) ? buf+1 : "none"; } */