/**************************************************************************** * _______ _ ______ _______ _______ ______ * * ( ____ \( \ ( __ \ |\ /|( ___ )( )|\ /|( __ \ * * | ( \/| ( | ( \ )| ) ( || ( ) || () () || ) ( || ( \ ) * * | (__ | | | | ) || (___) || (___) || || || || | | || | ) | * * | __) | | | | | || ___ || ___ || |(_)| || | | || | | | * * | ( | | | | ) || ( ) || ( ) || | | || | | || | ) | * * | (____/\| (____/\| (__/ )| ) ( || ) ( || ) ( || (___) || (__/ ) * * (_______/(_______/(______/ |/ \||/ \||/ \|(_______)(______/ * * +-+-+-+ +-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+ * * |T|h|e| |O|a|k|l|a|n|d| |C|h|r|o|n|i|c|l|e|s| * * +-+-+-+ +-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+ * * ------------------------------------------------------------------------- * * EldhaMUD code (C) 2003-2005 by Robert Powell (Tommi) * * EldhaMUD Team: Celest, Altere and Krelowyn * * ------------------------------------------------------------------------- * * * ****************************************************************************/ /**************************************************************************** * ResortMUD 4.0 Beta by Ntanel, Garinan, Badastaz, Josh, Digifuzz, Senir, * * Kratas, Scion, Shogar and Tagith. Special thanks to Thoric, Nivek, * * Altrag, Arlorn, Justice, Samson, Dace, HyperEye and Yakkov. * **************************************************************************** * Copyright (C) 1996 - 2001 Haslage Net Electronics: MudWorld * * of Lorain, Ohio - ALL RIGHTS RESERVED * * The text and pictures of this publication, or any part thereof, may not * * be reproduced or transmitted in any form or by any means, electronic or * * mechanical, includes photocopying, recording, storage in a information * * retrieval system, or otherwise, without the prior written or e-mail * * consent from the publisher. * **************************************************************************** * GREETING must mention ResortMUD programmers and the help file named * * CREDITS must remain completely intact as listed in the SMAUG license. * ****************************************************************************/ #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 <sys/stat.h> #include <time.h> #include "./Headers/mud.h" /* Locker System, (c) 1997-2001 Jay Roman, jay@directlink.net ===================================================================== */ LOCKER_DATA *load_locker( CHAR_DATA * ch ); void fread_locker( CHAR_DATA * ch, LOCKER_DATA * locker, FILE * fp ); void fwrite_locker( CHAR_DATA * ch ); ROOM_INDEX_DATA *generate_virtual_room( ROOM_INDEX_DATA * in_room ); void delete_locker( CHAR_DATA * ch ); /* Declared in act_move.c */ extern ROOM_INDEX_DATA *vroom_hash[64]; #define LOCKER_PRICE 50000 #define LOCKER_CAPACITY 5000 LOCKER_DATA *load_locker( CHAR_DATA * ch ) { LOCKER_DATA *locker; OBJ_DATA *obj; ROOM_INDEX_DATA *room; char strsave[MAX_INPUT_LENGTH]; FILE *fp; bool found; char buf[MAX_INPUT_LENGTH]; locker = NULL; /* * Find the locker file */ sprintf( strsave, "%s%s", LOCKER_DIR, capitalize( ch->name ) ); if( ( fp = fopen( strsave, "r" ) ) != NULL ) { CREATE( locker, LOCKER_DATA, 1 ); locker->capacity = 0; locker->holding = 0; locker->flags = 0; locker->room = 0; found = TRUE; for( ;; ) { char letter; char *word; letter = fread_letter( fp ); if( letter == '*' ) { fread_to_eol( fp ); continue; } if( letter != '#' ) { bug( "Load_locker: # not found.", 0 ); bug( ch->name, 0 ); break; } word = fread_word( fp ); if( !str_cmp( word, "LOCKER" ) ) { fread_locker( ch, locker, fp ); room = generate_virtual_room( ch->in_room ); ch->pcdata->locker_vnum = ch->in_room->vnum; ch->pcdata->locker_room = room; /* * Move the character to the locker room */ char_from_room( ch ); char_to_room( ch, room ); } else if( !str_cmp( word, "OBJECT" ) ) /* Objects */ fread_obj( ch, fp, OS_LOCKER ); else if( !str_cmp( word, "END" ) ) /* Done */ break; else { bug( "Load_locker: bad section.", 0 ); sprintf( buf, "[%s]", word ); bug( buf, 0 ); bug( ch->name, 0 ); break; } } fclose( fp ); /* * Total the weight of the contents */ for( obj = ch->in_room->first_content; obj; obj = obj->next_content ) { locker->holding = locker->holding + ( obj->weight * obj->count ); } } return locker; } #if defined(KEY) #undef KEY #endif #define KEY( literal, field, value ) \ if ( !str_cmp( word, literal ) ) \ { \ field = value; \ fMatch = TRUE; \ break; \ } void fread_locker( CHAR_DATA * ch, LOCKER_DATA * locker, FILE * fp ) { char buf[MAX_STRING_LENGTH]; char *word; bool fMatch; for( ;; ) { word = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; switch ( UPPER( word[0] ) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case 'C': KEY( "Capacity", locker->capacity, fread_number( fp ) ); break; case 'F': KEY( "Flags", locker->flags, fread_number( fp ) ); break; case 'E': if( !str_cmp( word, "End" ) ) return; break; case 'R': KEY( "Room", locker->room, fread_number( fp ) ); break; } if( !fMatch ) { sprintf( buf, "Fread_locker: no match: %s", word ); bug( buf, 0 ); } } } void fwrite_locker( CHAR_DATA * ch ) { /* * Variables */ FILE *fp = NULL; OBJ_DATA *obj; char strsave[MAX_INPUT_LENGTH]; if( !ch->pcdata->locker ) { bug( "Fwrite_locker: NULL object.", 0 ); bug( ch->name, 0 ); return; } sprintf( strsave, "%s%s", LOCKER_DIR, capitalize( ch->name ) ); if( ( fp = fopen( strsave, "w" ) ) != NULL ) { /* * Save the locker details */ fprintf( fp, "#LOCKER\n" ); fprintf( fp, "Capacity %d\n", ch->pcdata->locker->capacity ); fprintf( fp, "Flags %d\n", ch->pcdata->locker->flags ); fprintf( fp, "End\n\n" ); /* * Save the objects in the locker room */ for( obj = ch->in_room->first_content; obj; obj = obj->next_content ) { fwrite_obj( ch, obj, fp, 0, OS_LOCKER, TRUE ); } fprintf( fp, "#END\n" ); fclose( fp ); } return; } void do_locker( CHAR_DATA * ch, char *argument ) { /* * Variables */ char buf[MAX_INPUT_LENGTH]; LOCKER_DATA *locker; char arg[MAX_INPUT_LENGTH]; OBJ_DATA *obj; if( IS_NPC( ch ) ) return; argument = one_argument( argument, arg ); if( arg[0] == '\0' ) { send_to_char( "Syntax: locker <open | close>\r\n", ch ); return; } if( !str_cmp( arg, "open" ) ) { if( ch->pcdata->locker ) { send_to_char( "Your locker is already open.\r\n", ch ); return; } if( !xIS_SET( ch->in_room->room_flags, ROOM_LOCKER ) ) { send_to_char( "Does this smell like a locker room to you?\r\n", ch ); return; } locker = load_locker( ch ); if( !locker ) { send_to_char( "You do not have a locker.\r\n", ch ); return; } ch->pcdata->locker = locker; do_look( ch, "auto" ); send_to_char( "You are now in your personal locker.\r\n", ch ); } else if( !str_cmp( arg, "close" ) ) { if( !ch->pcdata->locker ) { send_to_char( "You are not currently in the locker room.\r\n", ch ); return; } locker = ch->pcdata->locker; /* * Total the weight of the contents */ locker->holding = 0; for( obj = ch->in_room->first_content; obj; obj = obj->next_content ) { locker->holding = locker->holding + ( obj->weight * obj->count ); } if( locker->holding > locker->capacity ) { sprintf( buf, "The weight limit of your locker has beed exceeded. " "You must carry\r\nsome items out when you leave.\r\n" ); send_to_char( buf, ch ); return; } /* * Save the locker */ fwrite_locker( ch ); /* * Return the player to the real world. */ char_from_room( ch ); char_to_room( ch, get_room_index( ch->pcdata->locker_vnum ) ); delete_locker( ch ); do_look( ch, "auto" ); send_to_char( "Your locker has been closed and saved.\r\n", ch ); } else { send_to_char( "Syntax: locker <open | close>\r\n", ch ); } return; } ROOM_INDEX_DATA *generate_virtual_room( ROOM_INDEX_DATA * in_room ) { ROOM_INDEX_DATA *room = NULL; int serial; short hash; bool found; int vnum = in_room->vnum; do { found = FALSE; serial = ( vnum << 16 ) | vnum; hash = serial % 64; for( room = vroom_hash[hash]; room; room = room->next ) { if( room->vnum == serial ) { found = TRUE; break; } } vnum++; } while( found ); if( !found ) { CREATE( room, ROOM_INDEX_DATA, 1 ); room->area = in_room->area; room->vnum = serial; room->tele_vnum = 1; room->sector_type = SECT_INSIDE; xSET_BIT( room->room_flags, ROOM_INDOORS ); xSET_BIT( room->room_flags, ROOM_PRIVATE ); xSET_BIT( room->room_flags, ROOM_NO_RECALL ); xSET_BIT( room->room_flags, ROOM_NO_SUMMON ); xSET_BIT( room->room_flags, ROOM_NO_ASTRAL ); room->next = vroom_hash[hash]; vroom_hash[hash] = room; ++top_vroom; } if( room ) { if( room->name ) STRFREE( room->name ); if( room->description ) STRFREE( room->description ); room->name = STRALLOC( "Locker Room" ); room->description = STRALLOC ( "Use LOCKER CLOSE to leave your locker and save its contents.\r\nYou may not leave containers in the locker.\r\n" ); } return room; } void delete_locker( CHAR_DATA * ch ) { /* * Clean-up the locker room -- Remove the loaded objects */ while( ch->pcdata->locker_room->first_content ) { extract_obj( ch->pcdata->locker_room->first_content ); } /* * Kill the locker object */ DISPOSE( ch->pcdata->locker ); ch->pcdata->locker = NULL; ch->pcdata->locker_vnum = 0; ch->pcdata->locker_room = NULL; /* * Need to delete the virtual room */ clear_vrooms( ); } void do_makelocker( CHAR_DATA * ch, char *argument ) { FILE *fp; char filename[256]; LOCKER_DATA *locker; char buf[MAX_STRING_LENGTH]; char name[MAX_INPUT_LENGTH]; struct stat fst; if( !argument || argument[0] == '\0' ) { send_to_char( "Usage: makelocker <player name>\n\r", ch ); return; } /* * Is this a valid player? */ strcpy( name, capitalize( argument ) ); sprintf( buf, "%s%c/%s", PLAYER_DIR, tolower( argument[0] ), name ); if( stat( buf, &fst ) == -1 ) { sprintf( buf, "Player file for %s does not exist!\r\n", name ); send_to_char( buf, ch ); return; } sprintf( filename, "%s%s", LOCKER_DIR, name ); if( stat( filename, &fst ) != -1 ) { sprintf( buf, "Locker file for %s already exists!\r\n", name ); send_to_char( buf, ch ); return; } CREATE( locker, LOCKER_DATA, 1 ); locker->capacity = LOCKER_CAPACITY; locker->flags = 0; if( ( fp = fopen( filename, "w" ) ) != NULL ) { /* * Save the locker details */ fprintf( fp, "#LOCKER\n" ); fprintf( fp, "Capacity %d\n", locker->capacity ); fprintf( fp, "Flags %d\n", locker->flags ); fprintf( fp, "End\n\n" ); fprintf( fp, "#END\n" ); fclose( fp ); sprintf( buf, "Locker [%s] created for %s\r\n", filename, argument ); send_to_char( buf, ch ); } return; } void do_buylocker( CHAR_DATA * ch, char *argument ) { char buf[MAX_STRING_LENGTH]; struct stat fst; if( !xIS_SET( ch->in_room->room_flags, ROOM_LOCKER ) ) { send_to_char( "You can't do that here.\n\r", ch ); return; } if( ch->gold >= LOCKER_PRICE ) { sprintf( buf, "%s%s", LOCKER_DIR, ch->name ); if( stat( buf, &fst ) != -1 ) { sprintf( buf, "You already have a locker!\r\n" ); send_to_char( buf, ch ); } else { ch->gold -= LOCKER_PRICE; do_makelocker( ch, ch->name ); send_to_char( "Your locker has now been created.\r\n", ch ); } } else { send_to_char( "You do not have the gold to buy a locker!\r\n", ch ); } return; }