LOP/
LOP/area/
LOP/boards/
LOP/channels/
LOP/clans/
LOP/color/
LOP/councils/
LOP/deity/
LOP/src/specials/
/*****************************************************************************
 * DikuMUD (C) 1990, 1991 by:                                                *
 *   Sebastian Hammer, Michael Seifert, Hans Henrik Staefeldt, Tom Madsen,   *
 *   and Katja Nyboe.                                                        *
 *---------------------------------------------------------------------------*
 * MERC 2.1 (C) 1992, 1993 by:                                               *
 *   Michael Chastain, Michael Quan, and Mitchell Tse.                       *
 *---------------------------------------------------------------------------*
 * SMAUG 1.4 (C) 1994, 1995, 1996, 1998 by: Derek Snider.                    *
 *   Team: Thoric, Altrag, Blodkai, Narn, Haus, Scryn, Rennard, Swordbearer, *
 *         gorog, Grishnakh, Nivek, Tricops, and Fireblade.                  *
 *---------------------------------------------------------------------------*
 * SMAUG 1.7 FUSS by: Samson and others of the SMAUG community.              *
 *                    Their contributions are greatly appreciated.           *
 *---------------------------------------------------------------------------*
 * LoP (C) 2006, 2007, 2008, 2009 by: the LoP team.                          *
 *****************************************************************************/

#include <ctype.h>
#include <string.h>
#include <stdio.h>
#include "h/mud.h"

void fwrite_locker( CHAR_DATA *ch, OBJ_DATA *locker )
{
   FILE *fp = NULL;
   char lockerfile[MIL], *name;

   if( !ch || is_npc( ch ) )
      return;
   if( !locker )
   {
      bug( "%s: NULL object. for character %s", __FUNCTION__, ch->name);
      send_to_char( "There was a problem trying to write your locker file!\r\n", ch );
      return;
   }

   name = capitalize( ch->name );
   snprintf( lockerfile, sizeof( lockerfile ), "%s%s", LOCKER_DIR, name );
   if( !( fp = fopen( lockerfile, "w" ) ) )
   {
      bug( "%s: Couldn't open %s for write", __FUNCTION__, lockerfile );
      send_to_char( "There was some problem in writing your locker file!\r\n", ch );
      return;
   }
   fwrite_obj( ch, locker, fp, 0, OS_LOCKER, false );
   fprintf( fp, "%s", "#END\n" );
   fclose( fp );
}

CMDF( do_locker )
{
   FILE *fp = NULL;
   char buf[MIL], arg[MIL], *name;
   OBJ_DATA *locker;
   OBJ_INDEX_DATA *ilocker;

   if( !ch || is_npc( ch ) )
      return;
   argument = one_argument( argument, arg );
   if( arg == NULL || arg[0] == '\0' || ( str_cmp( arg, "put" ) && str_cmp( arg, "get" ) && str_cmp( arg, "list" ) ) )
   {
      send_to_char( "Usage: locker put/get all\r\nUsage: locker put/get <object name>\r\nUsage: locker list\r\n", ch );
      return;
   }
   if( !xIS_SET( ch->in_room->room_flags, ROOM_LOCKER ) )
   {
      send_to_char( "You need to be in a locker room!\r\n", ch );
      return;
   }
   name = capitalize( ch->name );
   snprintf( buf, sizeof( buf ), "%s%s", LOCKER_DIR, name );
   if( ( fp = fopen( buf, "r" ) ) != NULL )
   {
      for( ;; )
      {
         char letter;
         char *word;

         letter = fread_letter( fp );
         if( letter == '#' )
         {
            word = fread_word( fp );
            if( !strcmp( word, "END" ) )
               break;
            if( !strcmp( word, "OBJECT" ) )
               fread_obj( ch, NULL, fp, OS_LOCKER );
         }
      }
      fclose( fp );
   }
   else
   {
      if( !( ilocker = get_obj_index( OBJ_VNUM_LOCKER ) ) )
      {
         send_to_char( "There is no locker to use currently.\r\n", ch );
         bug( "%s: Can't find the index locker! Vnum %d.", __FUNCTION__, OBJ_VNUM_LOCKER );
         return;
      }
      if( !( locker = create_object( ilocker, 0 ) ) )
      {
         send_to_char( "There is no locker to use currently.\r\n", ch );
         bug( "%s: Failed to create a locker! Vnum %d.", __FUNCTION__, OBJ_VNUM_LOCKER );
         return;
      }
      snprintf( buf, sizeof( buf ), locker->name, ch->name );
      STRSET( locker->name, buf );
      snprintf( buf, sizeof( buf ), locker->short_descr, ch->name );
      STRSET( locker->short_descr, buf );
      snprintf( buf, sizeof( buf ), locker->description, ch->name );
      STRSET( locker->description, buf );
      obj_to_room( locker, ch->in_room );
   }

   if( !str_cmp( arg, "put" ) )
   {
      snprintf( buf, sizeof( buf ), "put %s %s", argument, ch->name );
      interpret( ch, buf );
   }
   else if( !str_cmp( arg, "get" ) )
   {
      snprintf( buf, sizeof( buf ), "get %s %s", argument, ch->name );
      interpret( ch, buf );
   }
   else if( !str_cmp( arg, "list" ) )
   {
      snprintf( buf, sizeof( buf ), "look in %s", ch->name );
      interpret( ch, buf );
   }

   for( locker = ch->in_room->first_content; locker; locker = locker->next_content )
      if( locker->pIndexData->vnum == OBJ_VNUM_LOCKER && !str_cmp( locker->name, ch->name ) )
         break;

   if( locker )
   {
      if( locker->first_content )
         fwrite_locker( ch, locker );
      else
      {
         snprintf( buf, sizeof( buf ), "%s%s", LOCKER_DIR, name );
         remove_file( buf );
      }
      extract_obj( locker );
   }
   else
      send_to_char( "There was some problem in writing your locker file!\r\n", ch );
}

void rename_locker( CHAR_DATA *ch, char *newname )
{
   OBJ_DATA *locker;
   FILE *fp;
   char name[MSL], uname[MSL], buf[MSL];

   snprintf( name, sizeof( name ), "%s", capitalize( ch->name ) );
   snprintf( uname, sizeof( uname ), "%s", capitalize( newname ) );

   snprintf( buf, sizeof( buf ), "%s%s", LOCKER_DIR, name );
   if( ( fp = fopen( buf, "r" ) ) != NULL )
   {
      for( ;; )
      {
         char letter;
         char *word;

         letter = fread_letter( fp );
         if( letter == '#' )
         {
            word = fread_word( fp );
            if( !strcmp( word, "END" ) )
               break;
            if( !strcmp( word, "OBJECT" ) )
               fread_obj( ch, NULL, fp, OS_LOCKER );
         }
      }
      fclose( fp );
   }

   for( locker = ch->in_room->first_content; locker; locker = locker->next_content )
      if( locker->pIndexData->vnum == OBJ_VNUM_LOCKER && !str_cmp( locker->name, ch->name ) )
         break;

   if( locker )
   {
      if( locker->first_content )
      {
         snprintf( buf, sizeof( buf ), locker->pIndexData->name, uname );
         STRSET( locker->name, buf );
         snprintf( buf, sizeof( buf ), locker->pIndexData->short_descr, uname );
         STRSET( locker->short_descr, buf );
         snprintf( buf, sizeof( buf ), locker->pIndexData->description, uname );
         STRSET( locker->description, buf );
         fwrite_locker( ch, locker );
      }
      else
      {
         snprintf( buf, sizeof( buf ), "%s%s", LOCKER_DIR, name );
         remove_file( buf );
      }
      extract_obj( locker );
   }
}