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