/***************************************************************************
*       FALLEN ANGELS mud is protected by french law of intelectual        *
*                            property. we share freely all we have coded   *
*                            provided this message isn't removed from the  *
*                            files and you respect the name of all the     *
*                            coders,area builders, and all the Diku,Merc,  *
*                            Rom licences.                                 *
*                                                                          *
*                   Thank to : ROM consortium .                            *
*                   Big thank to : Gary Gygax !!!!!!!!!!!!!!               *
*                                                                          *
*       Fallen Angel project by : Loran      ( laurent zilbert )           *
*                                 Silfen or                                *
*                                 Gwendoline ( jerome despret  )           *
*                                                                          *
*       despret@ecoledoc.lip6.fr ... loran@hotmail.com                     *
***************************************************************************/

/***************************************************************************
*                                                                          *
*  To use this snipet you must set the following line in the "fileident"   *
*  help.                                                                   *
*                                                                          *
*    Coded for Fallen Angels by : Zilber laurent,Despret jerome.           *
*                                                                          *
*  And send a mail to say you use it ( feel free to comment ) at :         *
*                                                                          *
*  [despret@ecoledoc.lip6.fr] or/and at [loran@hotmail.com]                *
****************************************************************************/

/***************************************************************************
*                                                                          *
* If you want to put this snipet on your web site you are allowed to but   *
*  the file must remain unchanged and you have to send us a mail at :      *
*                                                                          *
*  [despret@ecoledoc.lip6.fr] or/and at [loran@hotmail.com]                *
*  with the site URL.                                                      *
*                                                                          *
***************************************************************************/



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

 This snipet allow you to ident stuff rom area directly to a file with
 you imm. The wext version will allow ident rooms and mobs this one
 work only for objects.

 Syntax : fileident [mob/obj/room] [begin vnum] [end vnum] [file name]

 I recommand you to give it to MAW_LEVEL imp only because it write file 
 to your account. Next version shoudl use a tmp file and mail the result
 to a specified email for imms that do not posses the account the mud is 
 runing on. 
                                                              Jerome.

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

#if defined(macintosh)
#include <types.h>
#include <time.h>
#else
#include <sys/types.h>
#include <sys/time.h>
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "merc.h"
#include "db.h"
#include "recycle.h"
#include "magic.h"


void do_fileident( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_STRING_LENGTH];
    char word[20];
    char start[20];
    char end[20];
    char file[20];
    
    int svnum;
    int evnum;
    int vnum;
    int i;

    FILE *fp;
    AFFECT_DATA *paf;

    int nMatch=0;
    extern int top_obj_index;
    OBJ_INDEX_DATA *pObjIndex;

   file[0] = '\0';

   argument = one_argument( argument , word   );
   argument = one_argument( argument , start  );
   argument = one_argument( argument , end    );
   argument = one_argument( argument , file   );

   svnum = atoi(start);
   evnum = atoi(end);

   if(file[0] == '\0')
     {
     send_to_char("syntax : fileident [mob/obj/room] [begin vnum] [end vnum] [file name]\n",ch); 
     return;
     }

   sprintf(buf,"ident/%s.id",file);
   if ( ( fp = fopen( buf, "w" ) ) == NULL )
    {
        perror( buf );
        return;
    }

    if( !str_cmp(word,"obj") || !str_cmp(word,"object") )
    { 
      for ( vnum = svnum; (nMatch < top_obj_index) && (vnum < evnum) ; vnum++ )
      {
          if ( ( pObjIndex = get_obj_index( vnum ) ) != NULL )
          {
           OBJ_DATA *obj=NULL;

           nMatch++;
           fprintf( fp, "Name(s): %s\n", pObjIndex->name );

           fprintf( fp, "Vnum: %d  Format: %s  Type: %s  Resets: %d\n",
           pObjIndex->vnum, pObjIndex->new_format ? "new" : "old",
           item_name(pObjIndex->item_type), pObjIndex->reset_num );

           fprintf( fp, "Short description: %s\nLong description: %s\n",
           pObjIndex->short_descr, pObjIndex->description );
 
          fprintf( fp, "Wear bits: %s\nExtra bits: %s\n",
              wear_bit_name(pObjIndex->wear_flags), 
              extra_bit_name( pObjIndex->extra_flags ) );

          fprintf( fp, "Weight : %d\n",pObjIndex->weight);

          fprintf( fp, "Values: %d %d %d %d %d\n",
              pObjIndex->value[0], pObjIndex->value[1], pObjIndex->value[2],
              pObjIndex->value[3], pObjIndex->value[4] );
         
          fprintf( fp, "\nLevel: %d  Cost: %d  Condition: %d\n",
              pObjIndex->level, pObjIndex->cost, pObjIndex->condition );

             switch ( pObjIndex->item_type )
              {
               case ITEM_SCROLL:
               case ITEM_POTION:
               case ITEM_PILL:

               fprintf( fp, "Level %d spell(s) of:", pObjIndex->value[0] );

               if(pObjIndex->value[1] >= 0 && pObjIndex->value[1] < MAX_SKILL )
               {
                fprintf(fp ," '%s'", skill_table[pObjIndex->value[1]].name);
               }
               if(pObjIndex->value[2] >= 0 && pObjIndex->value[2] < MAX_SKILL )
               {
                fprintf(fp ," '%s'", skill_table[pObjIndex->value[2]].name);
               }
               if(pObjIndex->value[3] >= 0 && pObjIndex->value[3] < MAX_SKILL )
               {
                fprintf(fp ," '%s'", skill_table[pObjIndex->value[3]].name);
               }
               if(pObjIndex->value[4] >= 0 && pObjIndex->value[4] < MAX_SKILL )
               {
                fprintf(fp ," '%s'", skill_table[pObjIndex->value[4]].name);
               }
               fprintf(fp ,"\n");
               break;

              case ITEM_WAND:
              case ITEM_STAFF:
              fprintf( fp, "Has %d(%d) charges of level %d",
               pObjIndex->value[1], pObjIndex->value[2], pObjIndex->value[0] );

             if ( pObjIndex->value[3] >= 0 && pObjIndex->value[3] < MAX_SKILL )
             {
               fprintf(fp ," '%s'\n", skill_table[pObjIndex->value[3]].name);
             }

               break;

           case ITEM_DRINK_CON:
                fprintf(fp,"It holds %s-colored %s.\n",
                     liq_table[pObjIndex->value[2]].liq_color,
                     liq_table[pObjIndex->value[2]].liq_name);
                break;

           case ITEM_WEAPON:
               fprintf(fp,"Weapon type is ");
               switch (pObjIndex->value[0])
               {
                   case(WEAPON_EXOTIC):
                       fprintf(fp,"exotic\n");
                       break;
                   case(WEAPON_SWORD):
                       fprintf(fp,"sword\n");
                       break;
                   case(WEAPON_DAGGER):
                       fprintf(fp,"dagger\n");
                       break;
                   case(WEAPON_SPEAR):
                       fprintf(fp,"spear/staff\n");
                       break;
                   case(WEAPON_MACE):
                       fprintf(fp,"mace/club\n");
                       break;
                   case(WEAPON_AXE):
                       fprintf(fp,"axe\n");
                       break;
                   case(WEAPON_FLAIL):
                       fprintf(fp,"flail\n");
                       break;
                   case(WEAPON_WHIP):
                       fprintf(fp,"whip\n");
                       break;
                   case(WEAPON_POLEARM):
                       fprintf(fp,"polearm\n");
                       break;
                   default:
                       fprintf(fp,"unknown\n");
                       break;
                }

                if (pObjIndex->new_format)
                    fprintf(fp,"Damage is %dd%d (average %d)\n",
                      pObjIndex->value[1],pObjIndex->value[2],
                      (1 + pObjIndex->value[2]) * pObjIndex->value[1] / 2);
                else
                   fprintf( fp, "Damage is %d to %d (average %d)\n",
                       pObjIndex->value[1], pObjIndex->value[2],
                       ( pObjIndex->value[1] + pObjIndex->value[2] ) / 2 );

                fprintf(fp,"Damage noun is %s.\n",
                    (   pObjIndex->value[3] > 0 
                     && pObjIndex->value[3] < MAX_DAMAGE_MESSAGE) ?
                        attack_table[pObjIndex->value[3]].noun : "undefined");
  
                if (pObjIndex->value[4])  /* weapon flags */
                {
                    fprintf(fp,"Weapons flags: %s\n",
                        weapon_bit_name(pObjIndex->value[4]));
                 }


              break;

        case ITEM_ARMOR:
            fprintf( fp,
            "Armor class is %d pierce, %d bash, %d slash, and %d vs. magic\n",
                pObjIndex->value[0], pObjIndex->value[1], 
                pObjIndex->value[2], pObjIndex->value[3] );

            break;

        case ITEM_CONTAINER:
            fprintf(fp,"Capacity: %d#  Maximum weight: %d#  flags: %s\n",
                pObjIndex->value[0], pObjIndex->value[3], 
                cont_bit_name(pObjIndex->value[1]));

            if (pObjIndex->value[4] != 100)
            {
                fprintf(fp,"Weight multiplier: %d%%\n",
                    pObjIndex->value[4]);
            }
        break;

       
     default :  
               break;


             }


             for ( paf = pObjIndex->affected; paf != NULL; paf = paf->next )
             {
               fprintf( fp, "Affects %s by %d, level %d\n",
                 affect_loc_name( paf->location ), paf->modifier,paf->level );

             if (paf->bitvector)
              {
                  switch(paf->where)
                  {
                      case TO_AFFECTS:
                         fprintf(fp,"Adds %s affect.\n",
                             affect_bit_name(paf->bitvector));
                        break;
                      case TO_WEAPON:
                         fprintf(fp,"Adds %s weapon flags.\n",
                            weapon_bit_name(paf->bitvector));
                        break;
                      case TO_OBJECT:
                         fprintf(fp,"Adds %s object flag.\n",
                           extra_bit_name(paf->bitvector));
                        break;
                      case TO_IMMUNE:
                          fprintf(fp,"Adds immunity to %s.\n",
                            imm_bit_name(paf->bitvector));
                        break;
                      case TO_RESIST:
                          fprintf(fp,"Adds resistance to %s.\n\r",
                             imm_bit_name(paf->bitvector));
                         break;
                      case TO_VULN:
                          fprintf(fp,"Adds vulnerability to %s.\n\r",
                            imm_bit_name(paf->bitvector));
                         break;
                      default:
                          fprintf(fp,"Unknown bit %d: %d\n\r",
                            paf->where,paf->bitvector);
                         break;
                    }
                }
             }

             if ( ( obj = get_obj_world( ch, pObjIndex->name ) ) == NULL )
              {
               fprintf(fp, "\nNot loaded.\n" );
              }
             else
             {
              fprintf( fp,
              "\nIn room: %d  In object: %s  Carried by: %s  Wear_loc: %d\n",
              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 );
              }


             fprintf(fp,"\n---------------------------------------\n\n");
        }


      }


    }
    else
    {
      send_to_char("syntax : fileident [mob/obj/room] [begin vnum] [end vnum] [file name]",ch);
    }
    fclose(fp);
    return;
}