diff -i smaug14/src/clans.c smaug18/src/clans.c
8c8
<  * Tricops and Fireblade                                      |             *
---
>  * Tricops, Fireblade, Edmond, Conran                         |             *
23,25d22
< #define MAX_NEST      100
< static OBJ_DATA *rgObjNest[MAX_NEST];
< 
29a27,29
> MEMBER_LIST *first_member_list;
> MEMBER_LIST *last_member_list;
> 
39a40,48
> void save_member_lists args( ( void ) );
> void show_members args( ( CHAR_DATA * ch, char *argument ) );
> void remove_member args( ( char *clanname, char *membername ) );
> 
> void add_member args( ( CHAR_DATA * ch, char *clanname ) );
> void save_member_lists args( ( void ) );
> void fread_member_list args( ( FILE * fp ) );
> 
> 
48c57
<               if ( !str_cmp( name, clan->name ) )
---
>               if ( !str_cmp( name, clan->name ) || ( ( clan->abbrev != '\0' ) && !str_cmp( name, clan->abbrev ) ) )
52a62,74
> /*
> CLAN_DATA *get_clan( char *name )
> {
>     CLAN_DATA *clan;
>     
>     for ( clan = first_clan; clan; clan = clan->next )
>        if ( !str_cmp( name, clan->name ) )
>          return clan;
>     return NULL;
> }
> */
> 
> 
58c80,84
<               if ( !str_cmp( name, council->name ) )
---
>               if ( !str_cmp( name, council->name )
>                       /*
>                        * council_short 
>                        */
>                       || ( ( council->abbrev != '\0' ) && !str_cmp( name, council->abbrev ) ) )
62a89,102
> 
> /*
> COUNCIL_DATA *get_council( char *name )
> {
>     COUNCIL_DATA *council;
>     
>     for ( council = first_council; council; council = council->next )
>        if ( !str_cmp( name, council->name ) )
>          return council;
>     return NULL;
> }
> */
> 
> 
134a175
>               fprintf( fp, "Abbrev       %s~\n", clan->abbrev );
222a264
>               fprintf( fp, "Storeroom    %d\n", council->storeroom );
223a266
>               fprintf( fp, "Abbrev       %s~\n", council->abbrev );
276a320
>                               KEY( "Abbrev", clan->abbrev, fread_string( fp ) );
473a518,521
>                       case 'A':
>                               KEY( "Abbrev", council->abbrev, fread_string( fp ) );
>                               break;
> 
515a564,566
>                       case 'S':
>                               KEY( "Storeroom", council->storeroom, fread_number( fp ) );
>                               break;
605c656,657
<               ROOM_INDEX_DATA *storeroom;
---
>               char fname[256];
>               VAULT_DATA *vault;
609,613c661,663
<               if ( clan->storeroom == 0 || ( storeroom = get_room_index( clan->storeroom ) ) == NULL )
<               {
<                       log_string( "Storeroom not found" );
<                       return found;
<               }
---
>               for ( vault = first_vault; vault; vault = vault->next )
>                       if ( clan->storeroom == vault->vnum )
>                               return found;
615,669c665,666
<               sprintf( filename, "%s%s.vault", CLAN_DIR, clan->filename );
<               if ( ( fp = fopen( filename, "r" ) ) != NULL )
<               {
<                       int iNest;
<                       bool found;
<                       OBJ_DATA *tobj, *tobj_next;
< 
<                       log_string( "Loading clan storage room" );
<                       rset_supermob( storeroom );
<                       for ( iNest = 0; iNest < MAX_NEST; iNest++ )
<                               rgObjNest[iNest] = NULL;
< 
<                       found = TRUE;
<                       for ( ;; )
<                       {
<                               char letter;
<                               char *word;
< 
<                               letter = fread_letter( fp );
<                               if ( letter == '*' )
<                               {
<                                       fread_to_eol( fp );
<                                       continue;
<                               }
< 
<                               if ( letter != '#' )
<                               {
<                                       bug( "Load_clan_vault: # not found.", 0 );
<                                       bug( clan->name, 0 );
<                                       break;
<                               }
< 
<                               word = fread_word( fp );
<                               if ( !str_cmp( word, "OBJECT" ) )       /* Objects  */
<                                       fread_obj( supermob, fp, OS_CARRY );
<                               else if ( !str_cmp( word, "END" ) )     /* Done     */
<                                       break;
<                               else
<                               {
<                                       bug( "Load_clan_vault: bad section.", 0 );
<                                       bug( clan->name, 0 );
<                                       break;
<                               }
<                       }
<                       fclose( fp );
<                       for ( tobj = supermob->first_carrying; tobj; tobj = tobj_next )
<                       {
<                               tobj_next = tobj->next_content;
<                               obj_from_char( tobj );
<                               obj_to_room( tobj, storeroom );
<                       }
<                       release_supermob(  );
<               }
<               else
<                       log_string( "Cannot open clan vault" );
---
>               sprintf( fname, "%s%s.vault", CLAN_DIR, clan->filename );
>               fread_storage( clan->storeroom, fname );
732a730,733
>       {
>               char fname[256];
>               VAULT_DATA *vault;
> 
734a736,742
>               for ( vault = first_vault; vault; vault = vault->next )
>                       if ( council->storeroom == vault->vnum )
>                               return found;
> 
>               sprintf( fname, "%s%s.vault", COUNCIL_DIR, council->filename );
>               fread_storage( council->storeroom, fname );
>       }
950a959,973
>       if ( !IS_PKILL( victim ) && clan->clan_type != CLAN_GUILD &&
>               clan->clan_type != CLAN_ORDER && clan->clan_type != CLAN_NOKILL )
>       {
>               send_to_char( "You cannot induct a peaceful character.\n\r", ch );
>               return;
>       }
> 
> /*
>     if ( xIS_SET( victim->act, PLR_NICE ) )
>     {
>       send_to_char( "This character is too 'nice' to induct.\n\r", ch );
>       return;
>     }
> */
> 
1010a1034,1035
>       {
>               xREMOVE_BIT( victim->act, PLR_NICE );
1011a1037
>       }
1029a1056,1057
>       add_member( victim, victim->pcdata->clan_name );
>       save_member_lists(  );
1080c1108
< /*    if ( victim->level < 51 )
---
> /*    if ( victim->level < LEVEL_IMMORTAL )
1109a1138
>       int x = 0, y = 0;
1131d1159
< 
1151a1180,1199
> 
>       if ( !str_cmp( ch->name, clan->leader ) )
>               x = 3;
>       if ( !str_cmp( ch->name, clan->number1 ) )
>               x = 2;
>       if ( !str_cmp( ch->name, clan->number2 ) )
>               x = 1;
>       if ( !str_cmp( victim->name, clan->leader ) )
>               y = 3;
>       if ( !str_cmp( victim->name, clan->number1 ) )
>               y = 2;
>       if ( !str_cmp( victim->name, clan->number2 ) )
>               y = 1;
> 
>       if ( x <= y && ( get_trust( ch ) <= get_trust( victim ) ) )
>       {
>               send_to_char( "You are not powerful enough to outcast this character.\n\r", ch );
>               return;
>       }
> 
1221a1270,1271
>       remove_member( victim->pcdata->clan_name, victim->name );
>       save_member_lists(  );
1227c1277,1281
<       act( AT_MAGIC, "$n outcasts you from $t", ch, clan->name, victim, TO_VICT );
---
>       if ( victim->desc && victim->desc->host )
>               act( AT_MAGIC, "$n outcasts you from $t", ch, clan->name, victim, TO_VICT );
>       else
>               add_loginmsg( victim->name, 6, NULL );
> 
1231c1285
<               echo_to_all( AT_MAGIC, buf, ECHOTAR_ALL );
---
>               echo_to_all( AT_MAGIC, buf, ECHOTAR_PK );
1335c1389,1390
<               if ( get_trust( ch ) >= LEVEL_GOD )
---
>               send_to_char( " badge abbrev\n\r", ch );
>               if ( get_trust( ch ) >= LEVEL_LESSER )
1414a1470,1477
>       if ( !str_cmp( arg2, "abbrev" ) )
>       {
>               STRFREE( clan->abbrev );
>               clan->abbrev = STRALLOC( argument );
>               send_to_char( "Done.\n\r", ch );
>               save_clan( clan );
>               return;
>       }
1444a1508,1515
>               VAULT_DATA *vault;
> 
>               if ( clan->storeroom )
>               {
>                       for ( vault = first_vault; vault; vault = vault->next )
>                               if ( vault->vnum == clan->storeroom )
>                                       UNLINK( vault, first_vault, last_vault, next, prev );
>               }
1445a1517,1519
>               CREATE( vault, VAULT_DATA, 1 );
>               vault->vnum = atoi( argument );
>               sort_vaults( vault );
1499c1573
<       if ( get_trust( ch ) < LEVEL_GOD )
---
>       if ( get_trust( ch ) < LEVEL_LESSER )
1646a1721
>               send_to_char( " abbrev storage\n\r", ch );
1701a1777,1794
>       if ( !str_cmp( arg2, "storage" ) )
>       {
>               VAULT_DATA *vault;
> 
>               if ( council->storeroom )
>               {
>                       for ( vault = first_vault; vault; vault = vault->next )
>                               if ( vault->vnum == council->storeroom )
>                                       UNLINK( vault, first_vault, last_vault, next, prev );
>               }
>               council->storeroom = atoi( argument );
>               CREATE( vault, VAULT_DATA, 1 );
>               vault->vnum = atoi( argument );
>               sort_vaults( vault );
>               send_to_char( "Done.\n\r", ch );
>               save_council( council );
>               return;
>       }
1723a1817,1824
>       if ( !str_cmp( arg2, "abbrev" ) )
>       {
>               STRFREE( council->abbrev );
>               council->abbrev = STRALLOC( argument );
>               send_to_char( "Done.\n\r", ch );
>               save_council( council );
>               return;
>       }
1781a1883
>       ch_printf_color( ch, "&wAbbrev   : &W%s\n\r", clan->abbrev ? clan->abbrev : "(not set)" );
1836a1939
>       ch_printf_color( ch, "&wAbbreviation :  &W%s\n\r", council->abbrev );
1841a1945
>       ch_printf_color( ch, "&wStoreroom: &W%-5d\n\r", council->storeroom );
1866a1971
>       clan->abbrev = STRALLOC( "" );
1902a2008,2009
>       council->abbrev = STRALLOC( "" );
> 
1961c2068,2069
<               || !str_cmp( ch->name, clan->number1 ) || !str_cmp( ch->name, clan->number2 ) )
---
>               || !str_cmp( ch->name, clan->number1 )
>               || !str_cmp( ch->name, clan->number2 ) || get_trust( ch ) >= LEVEL_GREATER )
1962a2071
>       ch_printf( ch, "Abbrev     :  %s\n\r", clan->abbrev ? clan->abbrev : "" );
2012c2121,2122
<               || !str_cmp( ch->name, order->number1 ) || !str_cmp( ch->name, order->number2 ) )
---
>               || !str_cmp( ch->name, order->number1 )
>               || !str_cmp( ch->name, order->number2 ) || get_trust( ch ) >= LEVEL_GREATER )
2013a2124
>       ch_printf( ch, "Abbrev     :  %s\n\r", order->abbrev ? order->abbrev : "" );
2023c2134
<       set_char_color( AT_CYAN, ch );
---
>       set_char_color( AT_GREEN, ch );
2031c2142
<               send_to_char_color( "\n\r&cTitle                    Head\n\r", ch );
---
>               send_to_char_color( "\n\r&GTitle                    Head\n\r", ch );
2039c2150
<               send_to_char_color( "&cUse 'councils <name of council>' for more detailed information.\n\r", ch );
---
>               send_to_char_color( "&GUse 'councils <name of council>' for more detailed information.\n\r", ch );
2045c2156
<               send_to_char_color( "&cNo such council exists...\n\r", ch );
---
>               send_to_char_color( "&GNo such council exists...\n\r", ch );
2048c2159
<       ch_printf_color( ch, "&c\n\r%s\n\r", council->name );
---
>       ch_printf_color( ch, "&G\n\r%s\n\r", council->name );
2050c2161
<               ch_printf_color( ch, "&cHead:     &w%s\n\r&cMembers:  &w%d\n\r", council->head, council->members );
---
>               ch_printf_color( ch, "&GHead:     &w%s\n\r&GMembers:  &w%d\n\r", council->head, council->members );
2052c2163
<               ch_printf_color( ch, "&cCo-Heads:     &w%s &cand &w%s\n\r&cMembers:  &w%d\n\r",
---
>               ch_printf_color( ch, "&GCo-Heads:     &w%s &Gand &w%s\n\r&GMembers:  &w%d\n\r",
2054c2165,2166
<       ch_printf_color( ch, "&cDescription:\n\r&w%s\n\r", council->description );
---
>       ch_printf_color( ch, "&GAbbrev:   &w%s\n\r", council->abbrev ? council->abbrev : "" );
>       ch_printf_color( ch, "&GDescription:\n\r&w%s\n\r", council->description );
2090a2203,2204
>               guild = get_clan( argument );
>       if ( !guild || guild->clan_type != CLAN_GUILD )
2103c2217,2218
<               || !str_cmp( ch->name, guild->number1 ) || !str_cmp( ch->name, guild->number2 ) )
---
>               || !str_cmp( ch->name, guild->number1 )
>               || !str_cmp( ch->name, guild->number2 ) || get_trust( ch ) >= LEVEL_GREATER )
2104a2220
>       ch_printf( ch, "Abbrev:    %s\n\r", guild->abbrev ? guild->abbrev : "" );
2109a2226,2261
> void do_defeats( CHAR_DATA * ch, char *argument )
> {
>       char filename[256];
> 
>       if ( IS_NPC( ch ) || !ch->pcdata->clan )
>       {
>               send_to_char( "Huh?\n\r", ch );
>               return;
>       }
>       if ( ch->pcdata->clan->clan_type != CLAN_ORDER && ch->pcdata->clan->clan_type != CLAN_GUILD )
>       {
>               sprintf( filename, "%s%s.defeats", CLAN_DIR, ch->pcdata->clan->name );
>               set_pager_color( AT_PURPLE, ch );
>               if ( !str_cmp( ch->name, ch->pcdata->clan->leader ) && !str_cmp( argument, "clean" ) )
>               {
>                       FILE *fp = fopen( filename, "w" );
> 
>                       if ( fp )
>                               fclose( fp );
>                       send_to_pager( "\n\rDefeats ledger has been cleared.\n\r", ch );
>                       return;
>               }
>               else
>               {
>                       send_to_pager( "\n\rLVL  Character                LVL  Character\n\r", ch );
>                       show_file( ch, filename );
>                       return;
>               }
>       }
>       else
>       {
>               send_to_char( "Huh?\n\r", ch );
>               return;
>       }
> }
> 
2157a2310
>       sh_int temp;
2222c2375
<       if ( IS_SET( victim->in_room->room_flags, ROOM_SAFE ) && get_timer( victim, TIMER_SHOVEDRAG ) <= 0 )
---
>       if ( xIS_SET( victim->in_room->room_flags, ROOM_SAFE ) && get_timer( victim, TIMER_SHOVEDRAG ) <= 0 )
2227c2380
<       victim->position = POS_SHOVE;
---
> /*    victim->position = POS_SHOVE; -- August, 2000 */
2237c2390
<               victim->position = POS_STANDING;
---
> /*        victim->position = POS_STANDING; --August, 2000 */
2241c2394
<       if ( IS_SET( to_room->room_flags, ROOM_DEATH ) )
---
>       if ( xIS_SET( to_room->room_flags, ROOM_DEATH ) )
2244c2397
<               victim->position = POS_STANDING;
---
> /*    victim->position = POS_STANDING; --August, 2000 */
2251c2404,2406
<               victim->position = POS_STANDING;
---
> /*
>       victim->position = POS_STANDING; -- August, 2000 
> */
2313c2468
<               victim->position = POS_STANDING;
---
> /*  victim->position = POS_STANDING; -- August, 2000 */
2315a2471,2472
>       temp = victim->position;
>       victim->position = POS_SHOVE;
2320c2477
<               victim->position = POS_STANDING;
---
>               victim->position = temp;
2325c2482
<       if ( IS_SET( ch->in_room->room_flags, ROOM_SAFE ) && get_timer( ch, TIMER_SHOVEDRAG ) <= 0 )
---
>       if ( xIS_SET( ch->in_room->room_flags, ROOM_SAFE ) && get_timer( ch, TIMER_SHOVEDRAG ) <= 0 )
2433c2590
<       if ( IS_SET( victim->in_room->room_flags, ROOM_SAFE ) && get_timer( victim, TIMER_SHOVEDRAG ) <= 0 )
---
>       if ( xIS_SET( victim->in_room->room_flags, ROOM_SAFE ) && get_timer( victim, TIMER_SHOVEDRAG ) <= 0 )
2452c2609
<       if ( IS_SET( to_room->room_flags, ROOM_DEATH ) )
---
>       if ( xIS_SET( to_room->room_flags, ROOM_DEATH ) )
2461c2618
<               victim->position = POS_STANDING;
---
> /*      victim->position = POS_STANDING; --August, 2000 */
2520c2677
<               victim->position = POS_STANDING;
---
> /*  victim->position = POS_STANDING; -- August, 2000 */
2541a2699,3094
> 
> 
> void show_members( CHAR_DATA * ch, char *argument )
> {
>       MEMBER_LIST *members_list;
>       MEMBER_DATA *member;
>       CLAN_DATA *clan;
>       int count = 0;
> 
> 
>       for ( members_list = first_member_list; members_list; members_list = members_list->next )
>       {
>               if ( !str_cmp( members_list->name, argument ) )
>                       break;
>       }
> 
>       if ( !members_list )
>               return;
> 
>       clan = get_clan( argument );
> 
>       if ( !clan )
>               return;
> 
>       pager_printf_color( ch, "\n\r&G%s membership roster\n\r", clan->name );
>       pager_printf_color( ch, "&GLeader    :  &w%s\n\r", clan->leader );
>       pager_printf_color( ch, "&GNumber One:  &w%s\n\r", clan->number1 );
>       pager_printf_color( ch, "&GNumber Two:  &w%s\n\r", clan->number2 );
>       pager_printf_color( ch, "&G::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\r" );
>       pager_printf_color( ch, "&GLvl  Name          Class       Kills   Deaths        Entered\n\r\n\r" );
>       for ( member = members_list->first_member; member; member = member->next )
>       {
>               if ( str_cmp( member->name, clan->leader ) && str_cmp( member->name, clan->number1 )
>                       && str_cmp( member->name, clan->number2 ) )
>                       pager_printf_color( ch, "&G%3d  &w%-12s  &G%-10s %6d  %7d     &g%10s\n\r",
>                               member->level,
>                               capitalize( member->name ),
>                               class_table[member->class]->who_name, member->kills, member->deaths, member->since );
>               count++;
>       }
>       pager_printf_color( ch, "\n\r%d members on the roll sheet.\n\r", count );
> }
> 
> void remove_member( char *clanname, char *membername )
> {
>       MEMBER_LIST *members_list;
>       MEMBER_DATA *member;
> 
>       for ( members_list = first_member_list; members_list; members_list = members_list->next )
>       {
>               if ( !str_cmp( members_list->name, clanname ) )
>                       break;
>       }
> 
>       if ( !members_list )
>               return;
> 
>       for ( member = members_list->first_member; member; member = member->next )
>       {
>               if ( !str_cmp( member->name, membername ) )
>               {
>                       UNLINK( member, members_list->first_member, members_list->last_member, next, prev );
>                       STRFREE( member->name );
>                       STRFREE( member->since );
>                       DISPOSE( member );
>                       break;
>               }
>       }
> }
> 
> void add_member( CHAR_DATA * ch, char *clanname )
> {
>       MEMBER_LIST *members_list;
>       MEMBER_DATA *nmember, *member;
>       CLAN_DATA *clan;
>       struct tm *t = localtime( &current_time );
>       char buf[MAX_STRING_LENGTH];
> 
>       if ( IS_IMMORTAL( ch ) && str_cmp( ch->name, ch->pcdata->clan->deity ) )
>               return;
> 
>       for ( members_list = first_member_list; members_list; members_list = members_list->next )
>       {
>               if ( !str_cmp( members_list->name, clanname ) )
>                       break;
>       }
> 
>       if ( ( clan = get_clan( clanname ) ) == NULL )
>               return;
> 
>       if ( !members_list )
>               return;
> 
>       for ( member = members_list->first_member; member; member = member->next )
>       {
>               if ( !str_cmp( member->name, ch->name ) )
>                       return;
>       }
> 
>       CREATE( nmember, MEMBER_DATA, 1 );
>       nmember->name = STRALLOC( ch->name );
>       nmember->level = ch->level;
>       nmember->class = ch->class;
>       sprintf( buf, "%02d/%02d/%04d", t->tm_mon + 1, t->tm_mday, t->tm_year + 1900 );
>       nmember->since = STRALLOC( buf );
>       if ( clan->clan_type == CLAN_ORDER || clan->clan_type == CLAN_GUILD )
>       {
>               nmember->kills = ch->pcdata->mkills;
>               nmember->deaths = ch->pcdata->mdeaths;
>       }
>       else
>       {
>               nmember->kills = ch->pcdata->pkills;
>               nmember->deaths = ch->pcdata->pdeaths;
>       }
>       LINK( nmember, members_list->first_member, members_list->last_member, next, prev );
> 
> }
> 
> void do_roster( CHAR_DATA * ch, char *argument )
> {
> 
>       if ( IS_NPC( ch ) || !ch->pcdata->clan )
>       {
>               send_to_char( "Huh?\n\r", ch );
>               return;
>       }
> 
> /*
>    if ( IS_SET( ch->pcdata->flags, PCFLAG_PAGERON ) && !IS_IMMORTAL( ch ) )
>    {
>       send_to_char( "The 'roster' command may not be used in conjunction with the pager until further notification.\n\r", ch );
>       return;
>    }
> */
> 
>       if ( IS_IMMORTAL( ch )
>               || !str_cmp( ch->name, ch->pcdata->clan->leader )
>               || !str_cmp( ch->name, ch->pcdata->clan->number1 ) || !str_cmp( ch->name, ch->pcdata->clan->number2 ) )
>       {
>               show_members( ch, ch->pcdata->clan_name );
>               return;
>       }
>       send_to_char( "Huh?\n\r", ch );
>       return;
> }
> 
> 
> void do_memberlist( CHAR_DATA * ch, char *argument )
> {
> 
>       if ( !IS_IMMORTAL( ch ) )
>       {
>               if ( IS_NPC( ch ) || !ch->pcdata->clan || str_cmp( ch->name, ch->pcdata->clan->leader ) )
>               {
>                       send_to_char( "Huh?\n\r", ch );
>                       return;
>               }
> 
>               show_members( ch, ch->pcdata->clan_name );
>               return;
>       }
>       else
>       {
>               char arg1[MAX_STRING_LENGTH];
> 
>               argument = one_argument( argument, arg1 );
> 
>               if ( argument[0] == '\0' || arg1[0] == '\0' )
>               {
>                       send_to_char( "Arguments are:  show, create or delete.\n\r", ch );
>                       return;
>               }
> 
>               if ( !str_cmp( arg1, "show" ) )
>               {
>                       if ( !str_cmp( argument, "all" ) )
>                       {
>                               MEMBER_LIST *members_list;
> 
>                               for ( members_list = first_member_list; members_list; members_list = members_list->next )
>                                       show_members( ch, members_list->name );
>                               return;
>                       }
> 
>                       show_members( ch, argument );
>                       return;
>               }
> 
>               if ( !str_cmp( arg1, "create" ) )
>               {
>                       MEMBER_LIST *members_list;
> 
>                       CREATE( members_list, MEMBER_LIST, 1 );
>                       members_list->name = STRALLOC( argument );
>                       LINK( members_list, first_member_list, last_member_list, next, prev );
>                       save_member_lists(  );
>                       ch_printf( ch, "Member lists \"%s\" created.\n\r", argument );
>                       return;
>               }
> 
>               if ( !str_cmp( arg1, "delete" ) )
>               {
>                       MEMBER_LIST *members_list;
>                       MEMBER_DATA *member;
> 
>                       for ( members_list = first_member_list; members_list; members_list = members_list->next )
>                               if ( !str_cmp( argument, members_list->name ) )
>                               {
>                                       while ( members_list->first_member )
>                                       {
>                                               member = members_list->first_member;
>                                               STRFREE( member->name );
>                                               STRFREE( member->since );
>                                               UNLINK( member, members_list->first_member, members_list->last_member, next, prev );
>                                               DISPOSE( member );
>                                       }
> 
>                                       STRFREE( members_list->name );
>                                       UNLINK( members_list, first_member_list, last_member_list, next, prev );
>                                       DISPOSE( members_list );
>                                       ch_printf( ch, "Member list \"%s\" destroyed.\n\r", argument );
>                                       save_member_lists(  );
>                                       return;
>                               }
>                       send_to_char( "No such list.\n\r", ch );
>                       return;
>               }
>       }
> }
> 
> void save_member_lists(  )
> {
>       MEMBER_LIST *members_list;
>       MEMBER_DATA *member;
>       FILE *fp;
> 
>       if ( ( fp = fopen( MEMBERS_FILE, "w" ) ) == NULL )
>       {
>               bug( "Cannot open members.dat for writing", 0 );
>               perror( SOCIAL_FILE );
>               return;
>       }
> 
>       for ( members_list = first_member_list; members_list; members_list = members_list->next )
>       {
>               fprintf( fp, "#Members_list\n" );
>               fprintf( fp, "Name          %s~\n", members_list->name );
>               for ( member = members_list->first_member; member; member = member->next )
>                       fprintf( fp, "Member        %s %s %d %d %d %d\n", member->name, member->since,
>                               member->kills, member->deaths, member->level, member->class );
>               fprintf( fp, "End\n\n" );
>       }
> 
>       fprintf( fp, "#END\n\n" );
>       fclose( fp );
> }
> 
> void load_member_lists(  )
> {
>       FILE *fp;
> 
>       if ( ( fp = fopen( MEMBERS_FILE, "r" ) ) == NULL )
>       {
>               bug( "Cannot open members.dat for reading", 0 );
>               return;
>       }
> 
>       for ( ;; )
>       {
>               char letter;
>               char *word;
> 
>               letter = fread_letter( fp );
> 
>               if ( letter != '#' )
>               {
>                       bug( "load_member_lists: # not found", 0 );
>                       return;
>               }
> 
>               word = fread_word( fp );
> 
>               if ( !str_cmp( word, "Members_list" ) )
>                       fread_member_list( fp );
>               else if ( !str_cmp( word, "END" ) )
>                       break;
>               else
>               {
>                       bug( "load_member_lists: bad section", 0 );
>                       break;
>               }
>       }
> 
>       fclose( fp );
>       save_member_lists(  );
> 
> }
> 
> 
> void fread_member_list( FILE * fp )
> {
>       MEMBER_LIST *members_list;
>       MEMBER_DATA *member;
> 
>       CREATE( members_list, MEMBER_LIST, 1 );
> 
>       for ( ;; )
>       {
>               char *word;
> 
>               word = fread_word( fp );
> 
>               if ( !str_cmp( word, "Name" ) )
>               {
>                       members_list->name = fread_string( fp );
>                       continue;
>               }
> #define PURGEROSTER
>               if ( !str_cmp( word, "Member" ) )
>               {
> #ifdef PURGEROSTER
>                       FILE *tfp;
>                       char pfile[MAX_INPUT_LENGTH];
> #endif
> 
>                       CREATE( member, MEMBER_DATA, 1 );
>                       member->name = STRALLOC( fread_word( fp ) );
> #ifdef PURGEROSTER
>                       sprintf( pfile, "%s%c/%s", PLAYER_DIR, tolower( member->name[0] ), capitalize( member->name ) );
>                       if ( ( tfp = fopen( pfile, "r" ) ) == NULL )
>                       {
>                               bug( "Deleting %s from roster - no pfile", member->name );
>                               STRFREE( member->name );
>                               DISPOSE( member );
>                               continue;
>                       }
>                       fclose( tfp );
> #endif
>                       member->since = STRALLOC( fread_word( fp ) );
>                       member->kills = fread_number( fp );
>                       member->deaths = fread_number( fp );
>                       member->level = fread_number( fp );
>                       member->class = fread_number( fp );
>                       LINK( member, members_list->first_member, members_list->last_member, next, prev );
>                       continue;
>               }
> 
>               if ( !str_cmp( word, "End" ) )
>               {
>                       LINK( members_list, first_member_list, last_member_list, next, prev );
>                       return;
>               }
>       }
> 
> }
> 
> void update_member( CHAR_DATA * ch )
> {
>       MEMBER_LIST *members_list;
>       MEMBER_DATA *member;
>       struct tm *t = localtime( &current_time );
>       char buf[MAX_STRING_LENGTH];
> 
>       if ( IS_NPC( ch ) || !ch->pcdata->clan )
>               return;
> 
>       for ( members_list = first_member_list; members_list; members_list = members_list->next )
>       {
>               if ( !str_cmp( members_list->name, ch->pcdata->clan_name ) )
>               {
>                       for ( member = members_list->first_member; member; member = member->next )
>                       {
>                               if ( !str_cmp( member->name, ch->name ) )
>                               {
>                                       if ( ch->pcdata->clan->clan_type == CLAN_PLAIN )
>                                       {
>                                               member->kills = ch->pcdata->pkills;
>                                               member->deaths = ch->pcdata->pdeaths;
>                                       }
>                                       else
>                                       {
>                                               member->kills = ch->pcdata->mkills;
>                                               member->deaths = ch->pcdata->mdeaths;
>                                       }
>                                       STRFREE( member->since );
>                                       sprintf( buf, "%02d/%02d/%04d", t->tm_mon + 1, t->tm_mday, t->tm_year + 1900 );
>                                       member->since = STRALLOC( buf );
>                                       member->level = ch->level;
>                                       if ( quitting_char == ch )
>                                               save_member_lists(  );
>                               }
>                       }
>               }
>       }
> }