/**************************************************************************** * ResortMUD Version 5.0 was mainly programmed by Ntanel, Garinan, Josh, * * Badastaz, Digifuzz, Senir, Kratas, Scion, Shogar and Tagith. * * ResortMud Version 5.0b programed By Badastaz and Garinan * ------------------------------------------------------------------------ * * Copyright (C) 1996 - 2001 Haslage Net Electronics: MudWorld of Lorain, * * Ohio. ALL RIGHTS RESERVED See /doc/RMLicense.txt for more details. * ****************************************************************************/ /* Original code by Xkilla Cleaned up by Dreimas Converted for Smaug by Zarius */ #include <time.h> #include "mud.h" #include "changes.h" char *current_date( void ); int num_changes( void ); int maxChanges; #define NULLSTR(str)(str == NULL || str[0] == '\0') CHANGE_DATA *changes_table; void load_changes( void ) { FILE *fp; int i; if( !( fp = fopen( CHANGES_FILE, "r" ) ) ) { bug( "%s", "Could not open Changes File for reading." ); return; } fscanf( fp, "%d\n", &maxChanges ); /* * Use malloc so we can realloc later on */ changes_table = malloc( sizeof( CHANGE_DATA ) * ( maxChanges + 1 ) ); for( i = 0; i < maxChanges; i++ ) { changes_table[i].change = fread_string( fp ); changes_table[i].coder = fread_string( fp ); changes_table[i].date = fread_string( fp ); changes_table[i].mudtime = fread_number( fp ); } changes_table[maxChanges].coder = str_dup( "" ); fclose( fp ); return; } char *current_date( ) { static char buf[128]; struct tm *datetime; datetime = localtime( ¤t_time ); sprintf( buf, "%-2.2d/%-2.2d/%2.2d", datetime->tm_mon + 1, datetime->tm_mday, datetime->tm_year - 100 ); return buf; } void save_changes( void ) { FILE *fp; int i, count = 0; if( !( fp = fopen( CHANGES_FILE, "w" ) ) ) { perror( CHANGES_FILE ); return; } fprintf( fp, "%d\n", maxChanges ); for( i = 0; i < maxChanges; i++ ) { count += 1; fprintf( fp, "%s~\n", changes_table[i].change ); fprintf( fp, "%s~\n", changes_table[i].coder ); fprintf( fp, "%s~\n", changes_table[i].date ); fprintf( fp, "%ld\n", changes_table[i].mudtime ); fprintf( fp, "\n" ); } fclose( fp ); return; } void delete_change( int iChange ) { int i, j; CHANGE_DATA *new_table; new_table = malloc( sizeof( CHANGE_DATA ) * maxChanges ); if( !new_table ) return; for( i = 0, j = 0; i < maxChanges + 1; i++ ) { if( i != ( iChange - 1 ) ) { new_table[j] = changes_table[i]; j++; } } free( changes_table ); changes_table = new_table; maxChanges--; return; } void do_addchange( CHAR_DATA * ch, char *argument ) { CHANGE_DATA *new_table; if( IS_NPC( ch ) ) return; if( argument[0] == '\0' ) { send_to_char( "Syntax: Addchange ChangeString\r\n", ch ); send_to_char( "&cType '&cchanges&c' to view the list.&d\r\n", ch ); return; } maxChanges++; new_table = realloc( changes_table, sizeof( CHANGE_DATA ) * ( maxChanges + 1 ) ); if( !new_table ) /* realloc failed */ { send_to_char( "Memory allocation failed. Brace for impact.\r\n", ch ); return; } changes_table = new_table; changes_table[maxChanges - 1].change = str_dup( argument ); changes_table[maxChanges - 1].coder = str_dup( ch->name ); changes_table[maxChanges - 1].date = str_dup( current_date( ) ); changes_table[maxChanges - 1].mudtime = current_time; send_to_char( "Changes Created.\r\n", ch ); send_to_char( "Type 'changes' to see the changes.\r\n", ch ); do_info( ch, " &zNew Change added to the mud, type '&Cchanges&z' to see it&z" ); save_changes( ); return; } void do_chsave( CHAR_DATA * ch, char *argument ) { char arg1[MIL], arg2[MIL], buf[MSL]; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if( IS_NPC( ch ) ) return; if( !ch->desc || NULLSTR( arg1 ) ) { send_to_char( "Syntax: chsave load/save\r\n", ch ); send_to_char( "Syntax: chsave delete (change number)\r\n", ch ); return; } if( !str_cmp( arg1, "load" ) ) { load_changes( ); send_to_char( "Changes Loaded.\r\n", ch ); return; } if( !str_cmp( arg1, "save" ) ) { save_changes( ); send_to_char( "Changes Saved.\r\n", ch ); return; } if( !str_cmp( arg1, "delete" ) ) { int num; if( NULLSTR( arg2 ) || !is_number( arg2 ) ) { send_to_char( "&wFor chsave delete, you must provide a change number.{x\r\n", ch ); send_to_char( "Syntax: chsave delete (change number)\r\n", ch ); return; } num = atoi( arg2 ); if( num < 1 || num > maxChanges ) { sprintf( buf, "Valid changes are from 1 to %d.\r\n", maxChanges ); send_to_char( buf, ch ); return; } delete_change( num ); send_to_char( "Change deleted.\r\n", ch ); return; } return; } int num_changes( void ) { char *test = current_date( ); int today = 0, i = 0; for( i = 0; i < maxChanges; i++ ) if( !str_cmp( test, changes_table[i].date ) ) today++; return today; } void do_changes( CHAR_DATA * ch, char *argument ) { char arg[MIL], buf[MSL], *test; int i, change, today; bool fAll, fchange = FALSE; one_argument( argument, arg ); if( IS_NPC( ch ) || maxChanges < 1 ) return; change = i = today = 0; test = current_date( ); for( i = 0; i < maxChanges; i++ ) if( !str_cmp( test, changes_table[i].date ) ) today++; if( NULLSTR( arg ) ) fAll = FALSE; else fAll = !str_cmp( arg, "all" ); if( is_number( arg ) ) { if( atoi( arg ) < 1 || atoi( arg ) > maxChanges ) { ch_printf( ch, "\r\n&WValid numbers are from 1 to %d&D\r\n", maxChanges ); return; } change = atoi( arg ); fAll = FALSE; fchange = TRUE; } send_to_char( "&wNo. Coder Date Change&d\r\n", ch ); for( i = 0; i < maxChanges; i++ ) { if( !fchange && !fAll && changes_table[i].mudtime + ( 7 * 24L * 3600L ) < current_time ) continue; if( !fchange && !fAll && str_cmp( test, changes_table[i].date ) ) continue; if( fchange && change != i + 1 ) continue; if( !fAll ) send_to_char( "\r\n", ch ); sprintf( buf, "&W[&R%4d&W]&B %-9s &C*%-6s &D\r\n", ( i + 1 ), changes_table[i].coder, changes_table[i].date ); send_to_char( buf, ch ); ch_printf( ch, "&D%s&D\r\n", changes_table[i].change ); } if( today > 0 ) { if( !fAll ) send_to_char( "\r\n", ch ); sprintf( buf, "&cThere&C-&cwas&C-&W[&R%4d&W]&C-&cchange%s-&ctoday.&C----------&D\r\n", today, today > 1 ? "s&C" : "&C-" ); send_to_char( buf, ch ); } else { if( !fAll ) send_to_char( "\r\n", ch ); } sprintf( buf, "&cThere&C-&care&C-&W[&R%4d&W]&C-&ctotal&C-&cchanges.&C----------&D\r\n", maxChanges ); send_to_char( buf, ch ); send_to_char( "&cType&C-&c'changes #'&C-&cto&C-&csee&C-&cthat&C-&cchange.&C-----&D\r\n", ch ); send_to_char( "&cType&C-&c'changes all'&C-&cto&C-&csee&C-&call&C-&cchanges.&C---&D\r\n", ch ); return; }