merentha_fluffos_v2/
merentha_fluffos_v2/bin/
merentha_fluffos_v2/fluffos-2.9-ds2.03/
merentha_fluffos_v2/fluffos-2.9-ds2.03/ChangeLog.old/
merentha_fluffos_v2/fluffos-2.9-ds2.03/Win32/
merentha_fluffos_v2/fluffos-2.9-ds2.03/compat/
merentha_fluffos_v2/fluffos-2.9-ds2.03/compat/simuls/
merentha_fluffos_v2/fluffos-2.9-ds2.03/include/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/clone/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/command/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/data/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/etc/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/include/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/inherit/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/inherit/master/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/log/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/single/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/single/tests/compiler/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/single/tests/efuns/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/single/tests/operators/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/u/
merentha_fluffos_v2/fluffos-2.9-ds2.03/tmp/
merentha_fluffos_v2/fluffos-2.9-ds2.03/windows/
merentha_fluffos_v2/lib/cfg/
merentha_fluffos_v2/lib/cfg/races/
merentha_fluffos_v2/lib/cmds/abilities/
merentha_fluffos_v2/lib/cmds/actions/
merentha_fluffos_v2/lib/cmds/spells/
merentha_fluffos_v2/lib/daemon/include/
merentha_fluffos_v2/lib/daemon/services/
merentha_fluffos_v2/lib/doc/
merentha_fluffos_v2/lib/doc/building/
merentha_fluffos_v2/lib/doc/help/classes/
merentha_fluffos_v2/lib/doc/help/general/
merentha_fluffos_v2/lib/doc/help/races/
merentha_fluffos_v2/lib/doc/help/skills/
merentha_fluffos_v2/lib/doc/help/stats/
merentha_fluffos_v2/lib/doc/man/efuns/
merentha_fluffos_v2/lib/doc/man/lfuns/
merentha_fluffos_v2/lib/doc/news/
merentha_fluffos_v2/lib/doc/old/
merentha_fluffos_v2/lib/doc/old/concepts/
merentha_fluffos_v2/lib/doc/old/lpc/constructs/
merentha_fluffos_v2/lib/doc/old/lpc/types/
merentha_fluffos_v2/lib/domains/ROOMS/
merentha_fluffos_v2/lib/domains/obj/armour/
merentha_fluffos_v2/lib/domains/obj/monsters/
merentha_fluffos_v2/lib/domains/obj/other/
merentha_fluffos_v2/lib/domains/obj/weapons/
merentha_fluffos_v2/lib/realms/petrarch/
merentha_fluffos_v2/lib/save/daemons/
merentha_fluffos_v2/lib/save/rid/
merentha_fluffos_v2/lib/save/users/a/
merentha_fluffos_v2/lib/save/users/p/
merentha_fluffos_v2/lib/save/users/t/
merentha_fluffos_v2/lib/std/login/
merentha_fluffos_v2/lib/std/obj/
merentha_fluffos_v2/win32/
// Petrarch
// Merentha Lib 1.0
// login.c

#include <std.h>
#include <config.h>

void catch_tell(string str);
void logon();
void continue_logon();
void query_name();
void query_password();
int check_password();
void confirm_name();
void enter_password();
void confirm_password();
void name_format();

string __Name, __CapName, tmp;
object __User=0;

void remove() {
        destruct(this_object());
}

void catch_tell(string str) {
    receive(str);
}

void logon() {
    receive(wrap(read_file("/doc/news/welcome")+"%^RESET%^"));
    receive(center("Mudlib: "+mudlib()+"    Driver: "+driver(), 80));
    receive("\n");

    continue_logon();
}

void continue_logon() {
    receive("\nPlease enter a name to enter this world with: ");
    input_to("query_name");
}

void query_name(string name) {
    if (!name || name=="") remove();
    name=player_name(name);
    if (strlen(name)<3) {
        receive("\nYour name is too short.\nPlease enter a name of at least 3 characters in length.");
        continue_logon();
        return;
    }
    if (strlen(name)>12) {
        receive("\nYour name is too long.\nPlease enter a name of no longer then 12 characters in length.");
        continue_logon();
        return;
    }
    __Name=name;
    if (player_exists(name)) {
        receive("\nThe character of "+name+" exists in this world.");
        receive("\nPlease enter the password for "+name+": ");
        input_to("query_password", 1);
        return;
    }
    receive("\nWelcome to the world of "+mud_name()+".\nThis is a fantasy world filled with elves and dwarves and humans and
dragons.  This is also a role-playing world.  The name you choose is
imporant and should respect these guidelines.  You will be deleted if your
name is found unsuitable.  
Do you wish to keep the name "+name+"? (y/n): ");
    input_to("confirm_name");
}

int check_password(string passwd) {
    string err;
    if(!__User) {
        __User=new(USER);
        err=catch(__User->load_player(__Name));
        if(err) __User=0;
        if(!__User) return 0;
    }
    return (__User->query_password() == crypt(passwd, __User->query_password()));
}

void query_override(string val) {
   if(!val || member_array(val, ({"y","n"}))==-1) {
     receive("\nThe character "+__Name+" is already interactive.\nDo you wish to override the character? (y/n) : ");
     input_to("query_override");
     return;
   }
   if(val=="n") {
     destruct(this_object());
     return;
   }
   __User=find_player(player_name(__Name));
   if(__User) {
      log_file("login_passed", ""+ctime(time())+" - "+player_name(__Name)+" - override - "+query_ip_number(this_object())+"\n");
      message("system","\nYou are being overridden.\n\n", __User);
      remove_interactive(__User);
      receive("\n\n");
      exec(__User, this_object());
      __User->reconnect();
   }
   destruct(this_object());
}    

void query_password(string passwd) {
    if (!passwd || passwd=="") {
        receive("\n");
        continue_logon();
        return;
    }
    if (!check_password(passwd)) {
        log_file("login_failed", ""+ctime(time())+" - "+player_name(__Name)+" - "+query_ip_number(this_object())+"\n");
        receive("\nIncorrect Password.  Please try again.");    
        receive("\nPlease re-enter the password for "+__Name+": ");
        input_to("query_password", 1);
        return;
    }
    if(find_player(player_name(__Name))) {
        if(interactive(find_player(player_name(__Name)))) {
           receive("\nThe character "+__Name+" is already interactive.\nDo you wish to override the character? (y/n) : ");
           input_to("query_override");
           return;
        }
        __User=find_player(player_name(__Name));
        if(__User) {
            log_file("login_passed", ""+ctime(time())+" - "+player_name(__Name)+" - (ld)return - "+query_ip_number(this_object())+"\n");
            remove_interactive(__User);
            receive("\n\n");
            exec(__User, this_object());
            __User->reconnect();
            return;
        }
    }
    log_file("login_passed", ""+ctime(time())+" - "+player_name(__Name)+" - login - "+query_ip_number(this_object())+"\n");
    exec(__User, this_object());
    __User->setup();
    destruct(this_object());
}

void confirm_name(string confirm) {
    if(!confirm || member_array(lower_case(confirm), ({"y", "ya", "yes"}))==-1) {
      continue_logon();
      return;
    }
    receive("\nYou now must choose a password.\nPlease enter a password: ");
    input_to("enter_password", 1);
}

void enter_password(string passwd) {
    if(!passwd || passwd=="" || strlen(passwd)<4 || strlen(passwd)>8) {
        receive("\nYour password is invalid.\nA password needs to be between 4 and 8 chacters long.");
        receive("\nPlease enter a password: ");
        input_to("enter_password", 1);
        return;
    }
    receive("\nPlease re-enter your password to confirm: ");
    tmp=passwd;
    input_to("confirm_password", 1);
}

void confirm_password(string passwd) {
    if(!passwd || tmp!=passwd) {
        receive("\nYour passwords did not match.\nBe sure to type your password in exactly the same way every time.");
        receive("\nPlease enter a password: ");
        input_to("enter_password", 1);
        return;
    }
    receive("\n\nPlease enter the format of your name.\nYou may add ' and - and capitalization as you wish within your name.\nDefault is \""+capitalize(__Name)+"\": ");
    input_to("name_format");
}

void name_format(string name) {
    if(!name || name=="") name=capitalize(__Name);
    if (__Name!=player_name(name)) {
        receive("\nYour formatting is incorrect.  You may only add ' or - or capitalizations.");
        receive("\nPlease enter the format of your name.\nYou may add ' and - and capitalization as you wish within your name.\nDefault is \""+capitalize(__Name)+"\": ");
        input_to("name_format");
        return;
    }
    __User=new(USER);
    __User->set_password(crypt(tmp,0));
    __User->set_name(__Name);
    __User->set_cap_name(name);
    exec(__User, this_object());
    __User->setup();
    destruct(this_object());
}