/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * Ack 2.2 improvements copyright (C) 1994 by Stephen Dooley * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * _/ _/_/_/ _/ _/ _/ ACK! MUD is modified * * _/_/ _/ _/ _/ _/ Merc2.0/2.1/2.2 code * * _/ _/ _/ _/_/ _/ (c)Stephen Zepp 1998 * * _/_/_/_/ _/ _/ _/ Version #: 4.3 * * _/ _/ _/_/_/ _/ _/ _/ * * * * http://ackmud.nuc.net/ * * zenithar@ackmud.nuc.net * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ /* Online Social Editting Module, * (c) 1996 Erwin S. Andreasen <erwin@pip.dknet.dk> * See the file "License" for important licensing information */ #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "globals.h" /* * #define CONST_SOCIAL *//* * remove this in Step 2 */ int maxSocial; /* max number of socials */ #ifndef CONST_SOCIAL struct social_type *social_table; /* and social table */ void load_social( FILE * fp, struct social_type *social ) { social->name = fread_string( fp ); social->char_no_arg = fread_string( fp ); social->others_no_arg = fread_string( fp ); social->char_found = fread_string( fp ); social->others_found = fread_string( fp ); social->vict_found = fread_string( fp ); social->char_auto = fread_string( fp ); social->others_auto = fread_string( fp ); } void load_social_table( ) { FILE *fp; int i; xprintf_2(log_buf,"Loading %s",SOCIAL_FILE); log_f(log_buf); fp = fopen( SOCIAL_FILE, "r" ); if( !fp ) { bug( "Could not open " SOCIAL_FILE " for reading.", 0 ); exit( 1 ); } fscanf( fp, "%d\n", &maxSocial ); /* * IMPORTANT to use malloc so we can realloc later on */ social_table = malloc( sizeof( struct social_type ) * ( maxSocial + 1 ) ); for( i = 0; i < maxSocial; i++ ) load_social( fp, &social_table[i] ); /* * For backwards compatibility */ social_table[maxSocial].name = str_dup( "" ); /* empty! */ log_f("Done."); fclose( fp ); } #endif /* CONST_SOCIAL */ void save_social( const struct social_type *s, FILE * fp ) { /* * get rid of (null) */ fprintf( fp, "%s~\n%s~\n%s~\n%s~\n%s~\n%s~\n%s~\n%s~\n\n", s->name ? s->name : "", s->char_no_arg ? s->char_no_arg : "", s->others_no_arg ? s->others_no_arg : "", s->char_found ? s->char_found : "", s->others_found ? s->others_found : "", s->vict_found ? s->vict_found : "", s->char_auto ? s->char_auto : "", s->others_auto ? s->others_auto : "" ); } void save_social_table( ) { FILE *fp; int i; fp = fopen( SOCIAL_FILE, "w" ); if( !fp ) { bug( "Could not open " SOCIAL_FILE " for writing.", 0 ); return; } #ifdef CONST_SOCIAL /* If old table still in use, count socials first */ for( maxSocial = 0; social_table[maxSocial].name[0]; maxSocial++ ) ; /* empty */ #endif fprintf( fp, "%d\n", maxSocial ); for( i = 0; i < maxSocial; i++ ) save_social( &social_table[i], fp ); fclose( fp ); } /* Find a social based on name */ int social_lookup( const char *name ) { int i; for( i = 0; i < maxSocial; i++ ) if( !str_cmp( name, social_table[i].name ) ) return i; return -1; } /* * Social editting command */ #ifndef CONST_SOCIAL void do_sedit( CHAR_DATA * ch, char *argument ) { char cmd[MAX_INPUT_LENGTH], social[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; int iSocial; smash_tilde( argument ); argument = one_argument( argument, cmd ); argument = one_argument( argument, social ); if( !cmd[0] ) { send_to_char( "Huh? Type HELP SEDIT to see syntax.\n\r", ch ); return; } if( !social[0] ) { send_to_char( "What social do you want to operate on?\n\r", ch ); return; } iSocial = social_lookup( social ); if( str_cmp( cmd, "new" ) && ( iSocial == -1 ) ) { send_to_char( "No such social exists.\n\r", ch ); return; } if( !str_cmp( cmd, "delete" ) ) /* Remove a social */ { int i, j; struct social_type *new_table = malloc( sizeof( struct social_type ) * maxSocial ); if( !new_table ) { send_to_char( "Memory allocation failed. Brace for impact...\n\r", ch ); return; } /* * Copy all elements of old table into new table, except the deleted social */ for( i = 0, j = 0; i < maxSocial + 1; i++ ) if( i != iSocial ) /* copy, increase only if copied */ { new_table[j] = social_table[i]; j++; } free( social_table ); social_table = new_table; maxSocial--; /* Important :() */ send_to_char( "That social is history now.\n\r", ch ); } else if( !str_cmp( cmd, "new" ) ) /* Create a new social */ { struct social_type *new_table; if( iSocial != -1 ) { send_to_char( "A social with that name already exists\n\r", ch ); return; } /* * reallocate the table */ /* * Note that the table contains maxSocial socials PLUS one empty spot! */ maxSocial++; new_table = realloc( social_table, sizeof( struct social_type ) * maxSocial + 1 ); if( !new_table ) /* realloc failed */ { send_to_char( "Memory allocation failed. Brace for impact.\n\r", ch ); return; } social_table = new_table; social_table[maxSocial - 1].name = str_dup( social ); social_table[maxSocial - 1].char_no_arg = str_dup( "" ); social_table[maxSocial - 1].others_no_arg = str_dup( "" ); social_table[maxSocial - 1].char_found = str_dup( "" ); social_table[maxSocial - 1].others_found = str_dup( "" ); social_table[maxSocial - 1].vict_found = str_dup( "" ); social_table[maxSocial - 1].char_auto = str_dup( "" ); social_table[maxSocial - 1].others_auto = str_dup( "" ); social_table[maxSocial].name = str_dup( "" ); /* 'terminating' empty string */ send_to_char( "New social added.\n\r", ch ); } else if( !str_cmp( cmd, "show" ) ) /* Show a certain social */ { xprintf( buf, "Social: %s\n\r" "(cnoarg) No argument given, character sees:\n\r" "%s\n\r\n\r" "(onoarg) No argument given, others see:\n\r" "%s\n\r\n\r" "(cfound) Target found, character sees:\n\r" "%s\n\r\n\r" "(ofound) Target found, others see:\n\r" "%s\n\r\n\r" "(vfound) Target found, victim sees:\n\r" "%s\n\r\n\r" "(cself) Target is character himself:\n\r" "%s\n\r\n\r" "(oself) Target is character himself, others see:\n\r" "%s\n\r", social_table[iSocial].name, social_table[iSocial].char_no_arg, social_table[iSocial].others_no_arg, social_table[iSocial].char_found, social_table[iSocial].others_found, social_table[iSocial].vict_found, social_table[iSocial].char_auto, social_table[iSocial].others_auto ); send_to_char( buf, ch ); return; /* return right away, do not save the table */ } else if( !str_cmp( cmd, "cnoarg" ) ) /* Set that argument */ { free_string( social_table[iSocial].char_no_arg ); social_table[iSocial].char_no_arg = str_dup( argument ); if( !argument[0] ) send_to_char( "Character will now see nothing when this social is used without arguments.\n\r", ch ); else act( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR ); } else if( !str_cmp( cmd, "onoarg" ) ) { free_string( social_table[iSocial].others_no_arg ); social_table[iSocial].others_no_arg = str_dup( argument ); if( !argument[0] ) send_to_char( "Others will now see nothing when this social is used without arguments.\n\r", ch ); else act( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR ); } else if( !str_cmp( cmd, "cfound" ) ) { free_string( social_table[iSocial].char_found ); social_table[iSocial].char_found = str_dup( argument ); if( !argument[0] ) send_to_char( "The character will now see nothing when a target is found.\n\r", ch ); else act( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR ); } else if( !str_cmp( cmd, "ofound" ) ) { free_string( social_table[iSocial].others_found ); social_table[iSocial].others_found = str_dup( argument ); if( !argument[0] ) send_to_char( "Others will now see nothing when a target is found.\n\r", ch ); else act( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR ); } else if( !str_cmp( cmd, "vfound" ) ) { free_string( social_table[iSocial].vict_found ); social_table[iSocial].vict_found = str_dup( argument ); if( !argument[0] ) send_to_char( "Victim will now see nothing when a target is found.\n\r", ch ); else act( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR ); } else if( !str_cmp( cmd, "cself" ) ) { free_string( social_table[iSocial].char_auto ); social_table[iSocial].char_auto = str_dup( argument ); if( !argument[0] ) send_to_char( "Character will now see nothing when targetting self.\n\r", ch ); else act( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR ); } else if( !str_cmp( cmd, "oself" ) ) { free_string( social_table[iSocial].others_auto ); social_table[iSocial].others_auto = str_dup( argument ); if( !argument[0] ) send_to_char( "Others will now see nothing when character targets self.\n\r", ch ); else act( "New message is now:\n\r$T\n\r", ch, NULL, argument, TO_CHAR ); } else { send_to_char( "Huh? Try HELP SEDIT.\n\r", ch ); return; } /* * We have done something. update social table */ save_social_table( ); } #endif /* CONST_SOCIAL */