Account System SWR/
diff -burpN swrfuss/src//act_comm.c swrfussdev/src//act_comm.c
--- swrfuss/src//act_comm.c	2009-01-02 13:46:40.000000000 -0500
+++ swrfussdev/src//act_comm.c	2009-07-20 04:44:24.000000000 -0400
@@ -33,6 +33,7 @@ void send_obj_page_to_char( CHAR_DATA *
 void send_room_page_to_char( CHAR_DATA * ch, ROOM_INDEX_DATA * idx, char page );
 void send_page_to_char( CHAR_DATA * ch, MOB_INDEX_DATA * idx, char page );
 void send_control_page_to_char( CHAR_DATA * ch, char page );
+void account_save( ACCOUNT_DATA *account );
 
 /*
  * Local functions.
@@ -1373,6 +1374,7 @@ void do_quit( CHAR_DATA * ch, const char
     */
    int x, y;
    int level;
+   struct tm *tms;
 
    if( IS_NPC( ch ) && IS_SET( ch->act, ACT_POLYMORPHED ) )
    {
@@ -1419,6 +1421,14 @@ void do_quit( CHAR_DATA * ch, const char
    act( AT_BYE, "$n has left the game.", ch, NULL, NULL, TO_ROOM );
    set_char_color( AT_GREY, ch );
 
+   if( ch->desc && ch->desc->account && !IS_IMMORTAL( ch ) )
+   {
+      tms = localtime( &current_time );
+      tms->tm_min += ACCOUNT_TIMER;
+      ch->desc->account->timer = mktime( tms );
+      account_save( ch->desc->account );
+   }
+
    sprintf( log_buf, "%s has quit.", ch->name );
    quitting_char = ch;
    save_char_obj( ch );
@@ -1426,6 +1436,8 @@ void do_quit( CHAR_DATA * ch, const char
    saving_char = NULL;
 
    level = get_trust( ch );
+   if( ch->desc )
+        ch->desc->connected = CON_ACCOUNT_PENDING;
    /*
     * After extract_char the ch is no longer valid!
     */
diff -burpN swrfuss/src//comm.c swrfussdev/src//comm.c
--- swrfuss/src//comm.c	2009-05-14 06:29:41.000000000 -0400
+++ swrfussdev/src//comm.c	2009-07-21 10:42:21.000000000 -0400
@@ -108,6 +108,10 @@ void display_prompt args( ( DESCRIPTOR_D
 void set_pager_input args( ( DESCRIPTOR_DATA * d, char *argument ) );
 bool pager_output args( ( DESCRIPTOR_DATA * d ) );
 void mail_count args( ( CHAR_DATA * ch ) );
+void account_dispose args( ( ACCOUNT_DATA *account ) );
+void account_nanny args( ( DESCRIPTOR_DATA *d, char *argument ) );
+void account_save args( ( ACCOUNT_DATA *account ) );
+bool account_add_character args ( ( ACCOUNT_DATA *account, const char *name, bool pending, bool newcharacter ) );
 
 int main( int argc, char **argv )
 {
@@ -455,8 +459,9 @@ void game_loop( void )
             close_socket( d, TRUE );
             continue;
          }
-         else if( ( !d->character && d->idle > 360 )  /* 2 mins */
-                  || ( d->connected != CON_PLAYING && d->idle > 1200 )  /* 5 mins */
+         else if( ( !d->character && d->connected != CON_ACCOUNT_PENDING && d->idle > 360 )  /* 2 mins */
+                  || ( d->connected != CON_PLAYING && d->connected != CON_ACCOUNT_PENDING && d->idle > 1200 )  /* 5 mins */
+                  || ( d->connected == CON_ACCOUNT_PENDING && d->idle > 12000)
                   || d->idle > 28800 ) /* 2 hrs  */
          {
             write_to_descriptor( d, "Idle timeout... disconnecting.\r\n", 0 );
@@ -516,6 +521,15 @@ void game_loop( void )
                      case CON_EDITING:
                         edit_buffer( d->character, cmdline );
                         break;
+                     case CON_GET_OLD_ACCOUNT_PASSWORD:
+                     case CON_COMFIRM_NEW_ACCOUNT:
+                     case CON_ACCOUNT_ADD_CHARACTER_PASSWORD:
+                     case CON_GET_NEW_ACCOUNT_PASSWORD:
+                     case CON_COMFIRM_ACCOUNT_PASSWORD:
+                     case CON_GET_ACCOUNT:
+                     case CON_ACCOUNT_PENDING:
+                       account_nanny( d, cmdline );
+                       break;
                   }
             }
          }
@@ -667,7 +681,7 @@ void new_descriptor( int new_desc )
    CREATE( dnew, DESCRIPTOR_DATA, 1 );
    dnew->next = NULL;
    dnew->descriptor = desc;
-   dnew->connected = CON_GET_NAME;
+   dnew->connected = CON_GET_ACCOUNT;
    dnew->outsize = 2000;
    dnew->idle = 0;
    dnew->lines = 0;
@@ -760,6 +774,11 @@ void new_descriptor( int new_desc )
 void free_desc( DESCRIPTOR_DATA * d )
 {
    close( d->descriptor );
+   if( d->account )
+   {
+       account_save( d->account );
+       account_dispose( d->account );
+   }
    STRFREE( d->host );
    DISPOSE( d->outbuf );
    if( d->pagebuf )
@@ -1459,6 +1478,13 @@ void nanny( DESCRIPTOR_DATA * d, const c
             return;
          }
 
+         if( !str_cmp( argument, "account" ) )
+         {
+            write_to_buffer( d, "Enter account name: ", 0 );
+            d->connected = CON_GET_ACCOUNT;
+            return;
+         }
+
          argument[0] = UPPER( argument[0] );
 
          if( !str_cmp( argument, "MSSP-REQUEST" ) )
@@ -1946,6 +1972,10 @@ void nanny( DESCRIPTOR_DATA * d, const c
 	{
 */ sprintf( log_buf, "%s@%s new %s.", ch->name, d->host,
                race_table[ch->race].race_name );
+
+         account_add_character(d->account, ch->name, FALSE, TRUE);
+         account_save( d->account );
+
          log_string_plus( log_buf, LOG_COMM, sysdata.log_level );
          to_channel( log_buf, CHANNEL_MONITOR, "Monitor", LEVEL_IMMORTAL );
          write_to_buffer( d, "Press [ENTER] ", 0 );
diff -burpN swrfuss/src//handler.c swrfussdev/src//handler.c
--- swrfuss/src//handler.c	2008-12-18 17:19:03.000000000 -0500
+++ swrfussdev/src//handler.c	2009-07-20 05:26:22.000000000 -0400
@@ -50,6 +50,7 @@ obj_ret global_objcode;
 OBJ_DATA *group_object( OBJ_DATA * obj1, OBJ_DATA * obj2 );
 void update_room_reset( CHAR_DATA *ch, bool setting );
 void delete_reset( RESET_DATA *pReset );
+void account_menu( DESCRIPTOR_DATA * d );
 
 void room_explode_1( OBJ_DATA * obj, CHAR_DATA * xch, ROOM_INDEX_DATA * room, int blast )
 {
@@ -1716,6 +1717,14 @@ void extract_char( CHAR_DATA * ch, bool
 
    if( ch->desc )
    {
+      if( ch->desc->account )
+      {
+         account_menu( ch->desc );
+         send_to_desc_color( "\n&WAccount&z:&W", ch->desc );
+         ch->desc->character = NULL;
+         ch->desc = NULL;
+         return;
+      }
       if( ch->desc->character != ch )
          bug( "Extract_char: char's descriptor points to another char", 0 );
       else
diff -burpN swrfuss/src//hotboot.c swrfussdev/src//hotboot.c
--- swrfuss/src//hotboot.c	2008-12-18 17:19:03.000000000 -0500
+++ swrfussdev/src//hotboot.c	2009-07-20 05:26:48.000000000 -0400
@@ -70,6 +70,8 @@ void update_room_reset( CHAR_DATA *ch, b
 
 extern ROOM_INDEX_DATA *room_index_hash[MAX_KEY_HASH];
 extern int port;  /* Port number to be used       */
+void  account_save args( ( ACCOUNT_DATA *account ) );
+ACCOUNT_DATA *account_fread( const char *name );
 
 /*
  * Save the world's ship files
@@ -432,6 +434,7 @@ void save_mobile( FILE * fp, CHAR_DATA *
 
 void save_world( CHAR_DATA * ch )
 {
+   ACCOUNT_DATA *account;
    FILE *mobfp;
    FILE *objfp;
    FILE *shipfp;
@@ -444,6 +447,9 @@ void save_world( CHAR_DATA * ch )
 
    log_string( "Preserving world state...." );
 
+   for( account = first_account; account; account = account->next )
+        account_save( account );
+
    snprintf( filename, 256, "%s%s", SYSTEM_DIR, MOB_FILE );
    if( ( mobfp = fopen( filename, "w" ) ) == NULL )
    {
@@ -1039,7 +1045,7 @@ void do_hotboot( CHAR_DATA * ch, const c
       {
 /* 			For test purposes
 			flush_buffer(d, TRUE);*/
-         fprintf( fp, "%d %d %d %d %d %s %s\n", d->can_compress, d->descriptor, och->in_room->vnum, d->port, d->idle, och->name, d->host );
+         fprintf( fp, "%d %d %d %d %d %s %s %s\n", d->can_compress, d->descriptor, och->in_room->vnum, d->port, d->idle, och->name, d->account ? d->account->name : "None", d->host );
          /*
           * One of two places this gets changed 
           */
@@ -1105,6 +1111,7 @@ void hotboot_recover( void )
    DESCRIPTOR_DATA *d = NULL;
    FILE *fp;
    char name[100];
+   char account[MAX_STRING_LENGTH];
    char host[MAX_STRING_LENGTH];
    int desc, room, dport, idle, dcompress, maxp = 0;
    bool fOld;
@@ -1123,7 +1130,7 @@ void hotboot_recover( void )
    {
       d = NULL;
 
-      fscanf( fp, "%d %d %d %d %d %s %s\n", &dcompress, &desc, &room, &dport, &idle, name, host );
+      fscanf( fp, "%d %d %d %d %d %s %s %s\n", &dcompress, &desc, &room, &dport, &idle, name, account, host );
 
       if( desc == -1 || feof( fp ) )
          break;
@@ -1147,7 +1154,7 @@ void hotboot_recover( void )
       CREATE( d->mccp, MCCP, 1 );
       d->next = NULL;
       d->descriptor = desc;
-      d->connected = CON_GET_NAME;
+      d->connected = CON_GET_ACCOUNT;
       d->outsize = 2000;
       d->idle = 0;
       d->lines = 0;
@@ -1158,6 +1165,7 @@ void hotboot_recover( void )
       CREATE( d->outbuf, char, d->outsize );
 
       d->host = STRALLOC( host );
+      d->account = account_fread( account );
       d->port = dport;
       d->idle = idle;
       LINK( d, first_descriptor, last_descriptor, next, prev );
diff -burpN swrfuss/src//Makefile swrfussdev/src//Makefile
--- swrfuss/src//Makefile	2009-05-14 06:29:41.000000000 -0400
+++ swrfussdev/src//Makefile	2009-07-20 05:42:17.000000000 -0400
@@ -22,7 +22,7 @@ L_FLAGS = $(PROF) $(NEED_MATH) -lz $(NEE
 
 W_FLAGS = -Wall -Werror -Wshadow -Wformat-security -Winline -Wpointer-arith -Wcast-align -Wredundant-decls -Wwrite-strings
 
-C_FILES = act_comm.c act_info.c act_move.c act_obj.c act_wiz.c boards.c bounty.c \
+C_FILES = account.c act_comm.c act_info.c act_move.c act_obj.c act_wiz.c boards.c bounty.c \
 	  build.c clans.c color.c comm.c comments.c const.c db.c fight.c \
 	  handler.c hashstr.c hotboot.c interp.c magic.c makeobjs.c mccp.c \
 	  misc.c mssp.c mud_comm.c mud_prog.c player.c reset.c save.c sha256.c shops.c \
diff -burpN swrfuss/src//mud.h swrfussdev/src//mud.h
--- swrfuss/src//mud.h	2009-05-30 16:48:19.000000000 -0400
+++ swrfussdev/src//mud.h	2009-07-20 05:25:25.000000000 -0400
@@ -116,6 +116,8 @@ typedef struct cmd_type CMDTYPE;
 typedef struct killed_data KILLED_DATA;
 typedef struct wizent WIZENT;
 typedef struct specfun_list SPEC_LIST;
+typedef struct account_character_data ACCOUNT_CHARACTER_DATA;
+typedef struct account_data ACCOUNT_DATA;
 
 /*
  * Function types.
@@ -218,6 +220,7 @@ typedef ch_ret SPELL_FUN( int sn, int le
 #define LEVEL_AVATAR		   (MAX_LEVEL - 5)
 
 #include "hotboot.h"
+#include "account.h"
 
 #define LEVEL_LOG		    LEVEL_LESSER
 #define LEVEL_HIGOD		    LEVEL_GOD
@@ -373,7 +376,11 @@ typedef enum
    CON_GET_WANT_RIPANSI, CON_TITLE, CON_PRESS_ENTER,
    CON_WAIT_1, CON_WAIT_2, CON_WAIT_3,
    CON_ACCEPTED, CON_GET_PKILL, CON_READ_IMOTD,
-   CON_COPYOVER_RECOVER, CON_PLAYING = 0, CON_EDITING
+   CON_COPYOVER_RECOVER, CON_PLAYING = 0, CON_EDITING,
+   CON_COMFIRM_NEW_ACCOUNT, CON_GET_OLD_ACCOUNT_PASSWORD,
+   CON_ACCOUNT_PENDING, CON_ACCOUNT_ADD_CHARACTER_PASSWORD,
+   CON_GET_NEW_ACCOUNT_PASSWORD, CON_COMFIRM_ACCOUNT_PASSWORD,
+   CON_GET_ACCOUNT
 } connection_types;
 
 /*
@@ -401,6 +408,7 @@ struct descriptor_data
   DESCRIPTOR_DATA *snoop_by;
   CHAR_DATA *character;
   CHAR_DATA *original;
+  ACCOUNT_DATA *account;
   struct mccp_data *mccp; /* Mud Client Compression Protocol */
   bool can_compress;
   const char *host;
@@ -3222,6 +3230,8 @@ extern CHAR_DATA *quitting_char;
 extern CHAR_DATA *loading_char;
 extern CHAR_DATA *saving_char;
 extern OBJ_DATA *all_obj;
+extern ACCOUNT_DATA *first_account;
+extern ACCOUNT_DATA *last_account;
 
 extern time_t current_time;
 extern bool fLogAll;
@@ -3835,6 +3845,7 @@ DECLARE_SPELL_FUN( spell_cure_addiction
  */
 #define PLAYER_DIR	"../player/"   /* Player files         */
 #define BACKUP_DIR	"../backup/"   /* Backup Player files    */
+#define ACCOUNT_DIR 	"../accounts/" /* Directory for accounts */
 #define GOD_DIR		"../gods/"  /* God Info Dir         */
 #define BOARD_DIR	"../boards/"   /* Board data dir    */
 #define CLAN_DIR	"../clans/" /* Clan data dir     */
@@ -4397,7 +4408,7 @@ void check_requests args( ( void ) );
 void write_corpses( CHAR_DATA * ch, const char *name );
 void save_char_obj args( ( CHAR_DATA * ch ) );
 void save_clone args( ( CHAR_DATA * ch ) );
-bool load_char_obj args( ( DESCRIPTOR_DATA * d, char *name, bool preload, bool copyover ) );
+bool load_char_obj args( ( DESCRIPTOR_DATA * d, const char *name, bool preload, bool copyover ) );
 void set_alarm args( ( long seconds ) );
 void requip_char args( ( CHAR_DATA * ch ) );
 void fwrite_obj args( ( CHAR_DATA * ch, OBJ_DATA * obj, FILE * fp, int iNest, short os_type, bool hotboot ) );
diff -burpN swrfuss/src//save.c swrfussdev/src//save.c
--- swrfuss/src//save.c	2009-04-12 06:39:25.000000000 -0400
+++ swrfussdev/src//save.c	2009-07-20 05:24:03.000000000 -0400
@@ -694,7 +694,7 @@ void fwrite_obj( CHAR_DATA * ch, OBJ_DAT
 /*
  * Load a char and inventory into a new ch structure.
  */
-bool load_char_obj( DESCRIPTOR_DATA * d, char *name, bool preload, bool copyover )
+bool load_char_obj( DESCRIPTOR_DATA * d, const char *name, bool preload, bool copyover )
 {
    char strsave[MAX_INPUT_LENGTH];
    CHAR_DATA *ch;
diff -burpN swrfuss/src//startup swrfussdev/src//startup
--- swrfuss/src//startup	2008-12-18 17:19:03.000000000 -0500
+++ swrfussdev/src//startup	2009-07-20 04:40:02.000000000 -0400
@@ -1,7 +1,7 @@
 #! /bin/csh -f
 
 # Set the port number.
-set port = 4020
+set port = 5555
 if ( "$1" != "" ) set port="$1"
 
 # Change to area directory.