/***************************************************************************

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

}

*/