Account System FOTE/
diff -r -N -u swfotefuss/src//act_comm.c allhopegone/src/act_comm.c
--- swfotefuss/src//act_comm.c	2006-02-05 17:36:07.000000000 -0500
+++ allhopegone/src/act_comm.c	2009-06-22 11:55:42.000000000 -0400
@@ -2098,6 +2098,7 @@
    OBJ_DATA *obj_next;
    int x, y;
    int level;
+   struct tm *tms;
    char qbuf[MAX_INPUT_LENGTH];
    CHAR_DATA *fch;
 
@@ -2154,6 +2155,14 @@
       sportschan( qbuf );
    }
 
+   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 );
+   }
+
    for( fch = first_char; fch; fch = fch->next )
    {
       if( IS_NPC( fch ) )
@@ -2182,6 +2191,8 @@
    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 -r -N -u swfotefuss/src//comm.c allhopegone/src/comm.c
--- swfotefuss/src//comm.c	2007-03-19 00:02:42.000000000 -0400
+++ allhopegone/src/comm.c	2009-07-17 06:13:52.000000000 -0400
@@ -116,6 +116,10 @@
 void set_pager_input( DESCRIPTOR_DATA * d, char *argument );
 bool pager_output( DESCRIPTOR_DATA * d );
 void mail_count( 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, char *name, bool pending, bool newcharacter ) );
 
 int main( int argc, char **argv )
 {
@@ -260,7 +264,7 @@
 {
    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;
@@ -485,8 +489,9 @@
             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 );
@@ -546,6 +551,15 @@
                      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; 
                   }
             }
          }
@@ -790,6 +804,11 @@
 void free_desc( DESCRIPTOR_DATA * d )
 {
    close( d->descriptor );
+   if( d->account )
+   {
+	account_save( d->account );
+	account_dispose( d->account );
+   }
    if( d->host )
       STRFREE( d->host );
    if( d->outbuf )
@@ -1472,6 +1491,13 @@
             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( !check_parse_name( argument ) )
          {
@@ -2170,6 +2196,10 @@
 	{
 */ 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 );
          send_to_desc_color( "\r\n&R&zWelcome to &RFall of the Empire&z. Press enter to continue.&w\r\n\r\n", d );
diff -r -N -u swfotefuss/src//handler.c allhopegone/src/handler.c
--- swfotefuss/src//handler.c	2008-01-12 17:25:34.000000000 -0500
+++ allhopegone/src/handler.c	2009-06-22 11:59:56.000000000 -0400
@@ -1697,6 +1697,15 @@
 
    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( "%s: char's descriptor points to another char", __FUNCTION__ );
       else
diff -r -N -u swfotefuss/src//hotboot.c allhopegone/src/hotboot.c
--- swfotefuss/src//hotboot.c	2008-01-12 17:28:02.000000000 -0500
+++ allhopegone/src/hotboot.c	2009-06-22 12:37:46.000000000 -0400
@@ -70,6 +70,9 @@
 
 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( char *name );
+
 
 /*
  * Save the world's ship files
@@ -427,6 +430,7 @@
 
 void save_world( CHAR_DATA * ch )
 {
+   ACCOUNT_DATA *account;
    FILE *mobfp;
    FILE *objfp;
    FILE *shipfp;
@@ -439,6 +443,9 @@
 
    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 )
    {
@@ -1040,8 +1047,8 @@
       }
       else
       {
-         fprintf( fp, "%d %d %d %d %d %s %s\n", d->descriptor,
-                  d->can_compress, och->in_room->vnum, d->port, d->idle, och->name, d->host );
+         fprintf( fp, "%d %d %d %d %d %s %s %s\n", d->descriptor,
+                  d->can_compress, 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 
           */
@@ -1108,6 +1115,7 @@
    FILE *fp;
    char name[100];
    char host[MAX_STRING_LENGTH];
+   char account[MAX_STRING_LENGTH];
    int desc, dcompress, room, dport, idle, maxp = 0;
    bool fOld;
 
@@ -1125,7 +1133,7 @@
    {
       d = NULL;
 
-      fscanf( fp, "%d %d %d %d %d %s %s\n", &desc, &dcompress, &room, &dport, &idle, name, host );
+      fscanf( fp, "%d %d %d %d %d %s %s %s\n", &desc, &dcompress, &room, &dport, &idle, name, account, host );
 
       if( desc == -1 || feof( fp ) )
          break;
@@ -1148,7 +1156,7 @@
       CREATE( d, DESCRIPTOR_DATA, 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;
@@ -1161,6 +1169,7 @@
       if( d->can_compress )
          compressStart( d );
       d->host = STRALLOC( host );
+      d->account = account_fread( account );
       d->port = dport;
       d->idle = idle;
       LINK( d, first_descriptor, last_descriptor, next, prev );
diff -r -N -u swfotefuss/src//Makefile allhopegone/src/Makefile
--- swfotefuss/src//Makefile	2006-12-30 17:39:36.000000000 -0500
+++ allhopegone/src/Makefile	2009-06-21 22:27:24.000000000 -0400
@@ -27,7 +27,7 @@
 	  force.c fskills.c functions.c handler.c hashstr.c hotboot.c hunter.c interp.c \
 	  magic.c makeobjs.c marriage.c mccp.c misc.c mud_comm.c mud_prog.c newarena.c \
 	  pfiles.c planets.c player.c reset.c save.c sha256.c ships.c shops.c skills.c slicers.c \
-	  space.c special.c swskills.c tables.c track.c tech.c update.c
+	  space.c special.c swskills.c tables.c track.c tech.c update.c account.c
 
 ifdef IMC
    C_FILES := imc.c $(C_FILES)
diff -r -N -u swfotefuss/src//mud.h allhopegone/src/mud.h
--- swfotefuss/src//mud.h	2008-01-12 17:28:43.000000000 -0500
+++ allhopegone/src/mud.h	2009-07-17 06:14:18.000000000 -0400
@@ -142,6 +142,8 @@
 typedef struct member_list MEMBER_LIST;   /* List of members in clan */
 typedef struct membersort_data MS_DATA;   /* List for sorted roster list */
 typedef struct specfun_list SPEC_LIST;
+typedef struct account_character_data ACCOUNT_CHARACTER_DATA;
+typedef struct account_data ACCOUNT_DATA;
 
 /*
  * Function types.
@@ -251,6 +253,7 @@
 #include "pfiles.h"
 #include "color.h"
 #include "hotboot.h"
+#include "account.h"
 #ifdef IMC
 #include "imc.h"
 #endif
@@ -490,8 +493,14 @@
    CON_GET_NEW_EMAIL, CON_GET_MSP, CON_GET_NEW_CLASS,
    CON_GET_NEW_SECOND, CON_ROLL_STATS, CON_STATS_OK,
    CON_GET_PUEBLO, CON_GET_HEIGHT, CON_GET_BUILD,
-   CON_GET_DROID,
-   CON_COPYOVER_RECOVER, CON_PLAYING = 0, CON_EDITING
+   CON_GET_DROID, 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;
 
 /*
@@ -524,6 +533,7 @@
    DESCRIPTOR_DATA *snoop_by;
    CHAR_DATA *character;
    CHAR_DATA *original;
+   ACCOUNT_DATA *account;
    struct mccp_data *mccp; /* Mud Client Compression Protocol */
    bool can_compress;
    char *host;
@@ -3901,6 +3911,9 @@
 
 extern BMARKET_DATA *first_market_ship;
 extern BMARKET_DATA *last_market_ship;
+extern ACCOUNT_DATA *first_account;
+extern ACCOUNT_DATA *last_account;
+
 
 /*
  * Command functions.
@@ -4668,6 +4681,7 @@
  */
 #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     */
diff -r -N -u swfotefuss/src//shutdown.txt allhopegone/src/shutdown.txt
--- swfotefuss/src//shutdown.txt	1969-12-31 19:00:00.000000000 -0500
+++ allhopegone/src/shutdown.txt	2009-06-22 12:45:09.000000000 -0400
@@ -0,0 +1 @@
+Unable to open area list