wolfpaw4.0-release/area/
wolfpaw4.0-release/backup/
wolfpaw4.0-release/bin/
wolfpaw4.0-release/boards/
wolfpaw4.0-release/clans/
wolfpaw4.0-release/councils/
wolfpaw4.0-release/deity/
wolfpaw4.0-release/finger/
wolfpaw4.0-release/gods/
wolfpaw4.0-release/guilds/
wolfpaw4.0-release/lockers/
wolfpaw4.0-release/log/
wolfpaw4.0-release/log/Clean/
wolfpaw4.0-release/maps/
wolfpaw4.0-release/offline_data/
wolfpaw4.0-release/player-obj/
wolfpaw4.0-release/player-obj/a/
wolfpaw4.0-release/player/
wolfpaw4.0-release/player/a/
wolfpaw4.0-release/plog/
wolfpaw4.0-release/save-rooms/
wolfpaw4.0-release/secure/
wolfpaw4.0-release/source/
wolfpaw4.0-release/source/betasrc/system/
wolfpaw4.0-release/source/betasrc/util/
wolfpaw4.0-release/system/clean-source/
wolfpaw4.0-release/system/clean-source/grux/
/*--------------------------------------------------------------------------*
 *                         ** 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;
}