/*--------------------------------------------------------------------------* * ** WolfPaw 1.0 ** * *--------------------------------------------------------------------------* * WolfPaw 1.0 (c) 1997,1998 by Dale Corse * *--------------------------------------------------------------------------* * The WolfPaw Coding Team is headed by: Greywolf * * With the Assitance from: Callinon, Dhamon, Sentra, Wyverns, Altrag * * Scryn, Thoric, Justice, Tricops and Mask. * *--------------------------------------------------------------------------* * Commands and Functions for use with Zones * *--------------------------------------------------------------------------*/ #include <stdio.h> #include <string.h> #include <time.h> #include <unistd.h> #include <ctype.h> #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include "mud.h" #define MIL MAX_INPUT_LENGTH bool fold_zone args( ( ZONE_DATA *pZone, char *filename ) ); bool write_zone_list args( ( void ) ); ZONE_DATA *make_new_zone args( ( char *filename ) ); /* * Creates a New Zone, and saves all the files assocsiated with it --GW */ void do_zcreate( CHAR_DATA *ch, char *argument ) { char arg[MIL]; ZONE_DATA *new_zone; bool written; record_call("<do_zcreate>"); written = FALSE; one_argument( argument, arg ); if ( arg[0] == '0' ) { send_to_char("Syntax: zcreate <zone name>\n\r",ch); return; } if ( (new_zone=make_new_zone(arg) ) == NULL ) { bug("MAKE_NEW_ZONE FAILED!!!!!",0); send_to_char("Zone Creation FAILED!\n\r",ch); return; } send_to_char("Zone Created\n",ch); ch_printf(ch,"Zone Number: %d Zone Name: %s\n", new_zone->number, new_zone->name ); ch_printf(ch,"Zone Filename: %s Zone List File: zone%d/%s\n",new_zone->filename, new_zone->number,new_zone->list_filename ); written = write_zone_list( ); if( written ) { send_to_char("Zone Creation Complete, Zone Installed.\n\r",ch); return; } bug("Write_zone_list: Write FAILED!",0); send_to_char("Zone Creation FAILED!!!\n\r",ch); return; } /* * Creates the new Zone, adds it to the list, and sets all the * Nessesary infromation on the zone. --GW */ ZONE_DATA *make_new_zone( char *name ) { char filename_buf[MSL]; char list_filename_buf[MSL]; int number; extern int top_zone; ZONE_DATA *pZone=NULL; char buf[MSL]; number = top_zone++; strcpy(list_filename_buf,"area.lst"); sprintf(filename_buf,"zone%d.zone",number); CREATE( pZone, ZONE_DATA, 1 ); pZone->name = name; pZone->filename = str_dup( filename_buf ); pZone->number = number; pZone->list_filename = str_dup( list_filename_buf ); pZone->first_mob = NULL; pZone->last_mob = NULL; pZone->first_obj = NULL; pZone->last_obj = NULL; LINK( pZone, first_zone, last_zone, next, prev ); top_zone++; sprintf(buf,"mkdir zone%d",pZone->number); system(buf); log_string("Zone Directory Created."); if ( fold_zone(pZone,pZone->filename)== FALSE ) { bug("Fold_Zone FAILED!",0); return pZone; } return pZone; } /* * 'folds' a Zone file, saving it to disk. --GW */ bool fold_zone( ZONE_DATA *pZone, char *filename ) { char buf[MSL]; FILE *fp; sprintf( buf, "Saving %s...", filename ); log_string_plus( buf, LOG_NORMAL, LEVEL_GOD ); sprintf( buf, "%s.bak", filename ); rename( filename, buf ); if ( ( fp = fopen( filename, "w" ) ) == NULL ) { bug( "Fold_Zone: fopen failed.", 0 ); perror( filename ); return FALSE; } fprintf( fp,"#ZONE %s~\n\n", pZone->name ); fprintf( fp,"#NUMBER\n%d\n\n",pZone->number ); fprintf( fp,"#LIST_NAME %s~\n\n",pZone->list_filename ); fprintf( fp,"#$\n" ); new_fclose( fp ); return TRUE; } /* * Writes all zone filenames to the zone.lst file. --GW */ bool write_zone_list( void ) { ZONE_DATA *in_zone; FILE *fp; if ( ( fp = fopen( ZONE_LIST, "w" ) ) == NULL ) { bug( "Write_Zone_List: fopen failed.", 0 ); perror( ZONE_LIST ); return FALSE; } for( in_zone = first_zone; in_zone; in_zone = in_zone->next ) { fprintf( fp,"%s\n",in_zone->filename); } fprintf( fp,"$"); new_fclose( fp ); return TRUE; } /* * Sets all the statistics for zones, use with CARE --GW */ void do_zset( CHAR_DATA *ch, char *argument ) { char arg1[MIL]; char arg2[MIL]; char arg3[MIL]; ZONE_DATA *in_zone; record_call("<do_zset>"); argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); argument = one_argument( argument, arg3 ); if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' ) { send_to_char("Syntax: zset <zone> <field> <argument>\n\r\n\r",ch); send_to_char("field being one of:\n\r",ch); send_to_char("number name list_filename filename\n\r",ch); return; } if ( ( in_zone=find_zone(atoi(arg1)) )== NULL ) { send_to_char("No such zone exists\n\r",ch); return; } if ( !str_cmp( arg2, "number" ) ) { if ( !is_number( arg3 ) ) { send_to_char( "Invalid Argument.\n\r",ch); return; } in_zone->number = atoi(arg3); send_to_char("Done.\n\r",ch); return; } if ( !str_cmp( arg2, "name" ) ) { smash_tilde(arg3); if( arg3[0] != '\0' ) STRFREE(in_zone->name ); in_zone->name = str_dup(arg3); send_to_char("Done.\n\r",ch); return; } if ( !str_cmp( arg2, "list_filename" ) ) { smash_tilde(arg3); if( arg3[0] != '\0' ) STRFREE(in_zone->list_filename ); in_zone->list_filename = str_dup(arg3); send_to_char("Done.\n\r",ch); return; } if ( !str_cmp( arg2, "filename" ) ) { smash_tilde(arg3); if( arg3[0] != '\0' ) STRFREE(in_zone->filename ); in_zone->filename = str_dup(arg3); send_to_char("Done.\n\r",ch); return; } send_to_char("Invalid Field.\n\r",ch); return; } void do_zstat( CHAR_DATA *ch, char *argument ) { ZONE_DATA *in_zone; int max_vnum; int vnum_count; char arg[MIL]; record_call("<do_zstat>"); one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char("Syntax: zstat <zone #>\n\r",ch); return; } if ( (in_zone=find_zone(atoi(arg)))==NULL ) { send_to_char("No such zone exists.\n\r",ch); return; } max_vnum = 32767; vnum_count = in_zone->top_mob; if( vnum_count < in_zone->top_obj ) vnum_count = in_zone->top_obj; if( vnum_count < in_zone->top_room ) vnum_count = in_zone->top_room; ch_printf( ch,"Zone: %s Number: %d\n\r",in_zone->name,in_zone->number ); ch_printf( ch,"List Filename: %s\n\r",in_zone->list_filename ); ch_printf( ch,"Filename: %s\n\r",in_zone->filename ); ch_printf( ch,"\n\rMaximum Usable Vnums: %d Vnums in use: %d\n\r", max_vnum,vnum_count); ch_printf( ch,"Objects: %d Mobiles: %d Rooms: %d\n\r",in_zone->top_obj, in_zone->top_mob,in_zone->top_room ); return; } void do_zlist( CHAR_DATA *ch, char *argument ) { char buf[MSL]; ZONE_DATA *in_zone; int znum = 0; int percent; int vnum_count, max_vnum; record_call("<do_zlist>"); for ( in_zone = first_zone; in_zone; in_zone = in_zone->next ) { percent = 0; buf[0] = '\0'; max_vnum = 32767; vnum_count = in_zone->top_mob; if( vnum_count < in_zone->top_obj ) vnum_count = in_zone->top_obj; if( vnum_count < in_zone->top_room ) vnum_count = in_zone->top_room; percent = max_vnum / vnum_count; sprintf(buf,"%d %-15s %d%% full.\n",in_zone->number,in_zone->name,percent); send_to_char(buf,ch); znum++; } sprintf(buf,"\n\rTotal Zones: %d\n\r",znum); send_to_char(buf,ch); return; }