/*****************************************************************************
*---------------------------------------------------------------------------*
* LoP (C) 2006, 2007, 2008 by: the LoP team. *
*---------------------------------------------------------------------------*
* Mud Wide Resets *
*****************************************************************************/
#include <ctype.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include "h/mud.h"
#define MWRESET_FILE SYSTEM_DIR "mwresets.dat"
typedef struct mwreset_data MWRESET_DATA;
struct mwreset_data
{
MWRESET_DATA *next, *prev;
short type;
int vnum;
int percent;
};
MWRESET_DATA *first_mwreset, *last_mwreset;
typedef enum
{
MW_OBJECT, MW_MOBILE, MW_MAX
} mw_types;
const char *mw_type[] =
{
"object", "mobile", "max"
};
void free_mwreset( MWRESET_DATA *reset )
{
if( !reset )
return;
DISPOSE( reset );
}
void free_all_mwresets( void )
{
MWRESET_DATA *reset, *reset_next;
for( reset = first_mwreset; reset; reset = reset_next )
{
reset_next = reset->next;
UNLINK( reset, first_mwreset, last_mwreset, next, prev );
free_mwreset( reset );
}
}
void save_mwresets( void )
{
MWRESET_DATA *reset;
FILE *fp;
if( !( fp = fopen( MWRESET_FILE, "w" ) ) )
{
bug( "%s: Can't open %s for writing.", __FUNCTION__, MWRESET_FILE );
perror( MWRESET_FILE );
return;
}
for( reset = first_mwreset; reset; reset = reset->next )
{
fprintf( fp, "%s", "#MWRESET\n" );
if( reset->type >= 0 && reset->type < MW_MAX )
fprintf( fp, "Type %s~", mw_type[reset->type] );
fprintf( fp, "Vnum %d\n", reset->vnum );
fprintf( fp, "Percent %d\n", reset->percent );
fprintf( fp, "%s", "End\n\n" );
}
fprintf( fp, "%s", "#END\n" );
fclose( fp );
fp = NULL;
}
void fread_mwreset( FILE *fp )
{
const char *word;
char *infoflags, flag[MIL];
bool fMatch;
MWRESET_DATA *reset;
int value;
CREATE( reset, MWRESET_DATA, 1 );
reset->vnum = 0;
reset->percent = 0;
reset->type = 0;
for( ;; )
{
word = feof( fp ) ? "End" : fread_word( fp );
fMatch = false;
switch( UPPER( word[0] ) )
{
case '*':
fMatch = true;
fread_to_eol( fp );
break;
case 'E':
if( !str_cmp( word, "End" ) )
{
LINK( reset, first_mwreset, last_mwreset, next, prev );
return;
}
break;
case 'P':
KEY( "Percent", reset->percent, fread_number( fp ) );
break;
case 'T':
SKEY( "Type", reset->type, fp, mw_type, MW_MAX );
break;
case 'V':
KEY( "Vnum", reset->vnum, fread_number( fp ) );
break;
}
if( !fMatch )
{
bug( "%s: no match: %s", __FUNCTION__, word );
fread_to_eol( fp );
}
}
free_mwreset( reset );
}
MWRESET_DATA *find_mwreset( int check )
{
MWRESET_DATA *reset;
int count = 0;
for( reset = first_mwreset; reset; reset = reset->next )
{
if( ++count == check )
return reset;
}
return NULL;
}
CMDF( do_mwreset )
{
MWRESET_DATA *reset;
char arg[MIL];
int count = 0, value;
if( !argument || argument[0] == '\0' )
{
send_to_char( "Usage: mwreset create <vnum> <percent(1-100)>\r\n", ch );
send_to_char( "Usage: mwreset <#> delete/vnum/percent/type <value>\r\n", ch );
for( reset = first_mwreset; reset; reset = reset->next )
ch_printf( ch, "%2d> Type: %6s Vnum: %d Percent: %d\r\n", ++count,
mw_type[reset->type], reset->vnum, reset->percent );
if( !count )
send_to_char( "No mud wide resets yet.\r\n", ch );
return;
}
argument = one_argument( argument, arg );
if( !str_cmp( arg, "create" ) )
{
int vnum, percent;
argument = one_argument( argument, arg );
vnum = atoi( arg );
argument = one_argument( argument, arg );
percent = atoi( arg );
if( !vnum || !percent || percent > 100 )
{
send_to_char( "Usage: mwreset create <vnum> <percent(1-100)>\r\n", ch );
return;
}
CREATE( reset, MWRESET_DATA, 1 );
reset->vnum = atoi( arg );
reset->percent = atoi( arg );
reset->type = MW_OBJECT;
LINK( reset, first_mwreset, last_mwreset, next, prev );
save_mwresets( );
ch_printf( ch, "Reset created for object vnum %d with a percent of %d.\r\n", reset->vnum, reset->percent );
return;
}
if( !( reset = find_mwreset( atoi( arg ) ) ) )
{
send_to_char( "No such reset to modify.\r\n", ch );
return;
}
argument = one_argument( argument, arg );
value = atoi( argument );
if( !str_cmp( arg, "delete" ) )
{
UNLINK( reset, first_mwreset, last_mwreset, next, prev );
free_mwreset( reset );
save_mwresets( );
send_to_char( "Reset deleted.\r\n", ch );
return;
}
if( !str_cmp( arg, "vnum" ) )
{
if( value <= 0 || value > MAX_VNUM )
{
send_to_char( "Vnum out of range.\r\n", ch );
return;
}
reset->vnum = value;
save_mwresets( );
send_to_char( "Vnum set.\r\n", ch );
return;
}
if( !str_cmp( arg, "percent" ) )
{
if( value <= 0 || value > 100 )
{
send_to_char( "Percent out of range.\r\n", ch );
return;
}
reset->percent = value;
save_mwresets( );
send_to_char( "Percent set.\r\n", ch );
return;
}
if( !str_cmp( arg, "type" ) )
{
if( !is_number( argument ) )
value = get_flag( argument, mw_type, MW_MAX );
if( value < 0 || value >= MW_MAX )
{
ch_printf( ch, "Type can be set from 0 to %d.\r\n", ( MW_MAX - 1 ) );
for( value = 0; value < MW_MAX; value++ )
ch_printf( ch, "%2d = %s\r\n", value, mw_type[value] );
return;
}
reset->type = value;
save_mwresets( );
ch_printf( ch, "Type set to [%d]%s.\r\n", reset->type, mw_type[reset->type] );
return;
}
}
void handle_mwmobilereset( ROOM_INDEX_DATA *room )
{
MWRESET_DATA *reset;
MOB_INDEX_DATA *mindex;
CHAR_DATA *mob;
if( !room )
return;
for( reset = first_mwreset; reset; reset = reset->next )
{
if( reset->type != MW_MOBILE )
continue;
/* 75% of it skiping anyways */
if( number_percent( ) > 25 )
continue;
/* Then take into consideration the percent it has */
if( number_percent( ) > reset->percent )
continue;
if( !( mindex = get_mob_index( reset->vnum ) ) )
continue;
if( !( mob = create_mobile( mindex ) ) )
continue;
char_to_room( mob, room );
}
}
void handle_mwreset( OBJ_DATA *corpse )
{
MWRESET_DATA *reset;
OBJ_INDEX_DATA *oindex;
OBJ_DATA *obj;
if( !corpse )
return;
for( reset = first_mwreset; reset; reset = reset->next )
{
if( reset->type != MW_OBJECT )
continue;
/* 50% of it skiping anyways */
if( number_percent( ) > 50 )
continue;
/* Then take into consideration the percent it has */
if( number_percent( ) > reset->percent )
continue;
if( !( oindex = get_obj_index( reset->vnum ) ) )
continue;
if( !( obj = create_object( oindex, 0 ) ) )
continue;
obj_to_obj( obj, corpse );
}
}
void load_mwresets( void )
{
FILE *fp;
first_mwreset = last_mwreset = NULL;
if( !( fp = fopen( MWRESET_FILE, "r" ) ) )
return;
for( ;; )
{
char letter;
char *word;
letter = fread_letter( fp );
if( letter == '*' )
{
fread_to_eol( fp );
continue;
}
if( letter != '#' )
{
bug( "%s: # not found.", __FUNCTION__ );
break;
}
word = fread_word( fp );
if( !str_cmp( word, "MWRESET" ) )
{
fread_mwreset( fp );
continue;
}
else if( !str_cmp( word, "END" ) )
break;
else
{
bug( "%s: bad section (%s).", __FUNCTION__, word );
fread_to_eol( fp );
continue;
}
}
fclose( fp );
fp = NULL;
}