dsI/bin/
dsI/extra/creremote/
dsI/extra/mingw/
dsI/extra/wolfpaw/
dsI/fluffos-2.7-ds2.018/
dsI/fluffos-2.7-ds2.018/ChangeLog.old/
dsI/fluffos-2.7-ds2.018/Win32/
dsI/fluffos-2.7-ds2.018/compat/
dsI/fluffos-2.7-ds2.018/compat/simuls/
dsI/fluffos-2.7-ds2.018/testsuite/
dsI/fluffos-2.7-ds2.018/testsuite/clone/
dsI/fluffos-2.7-ds2.018/testsuite/command/
dsI/fluffos-2.7-ds2.018/testsuite/data/
dsI/fluffos-2.7-ds2.018/testsuite/etc/
dsI/fluffos-2.7-ds2.018/testsuite/include/
dsI/fluffos-2.7-ds2.018/testsuite/inherit/
dsI/fluffos-2.7-ds2.018/testsuite/inherit/master/
dsI/fluffos-2.7-ds2.018/testsuite/log/
dsI/fluffos-2.7-ds2.018/testsuite/single/
dsI/fluffos-2.7-ds2.018/testsuite/single/tests/compiler/
dsI/fluffos-2.7-ds2.018/testsuite/single/tests/efuns/
dsI/fluffos-2.7-ds2.018/testsuite/single/tests/operators/
dsI/fluffos-2.7-ds2.018/testsuite/u/
dsI/fluffos-2.7-ds2.018/tmp/
dsI/lib/cfg/
dsI/lib/cmds/common/
dsI/lib/cmds/creators/include/
dsI/lib/cmds/creators/include/SCCS/
dsI/lib/daemon/services/
dsI/lib/doc/
dsI/lib/domains/Ylsrim/
dsI/lib/domains/Ylsrim/adm/
dsI/lib/domains/Ylsrim/armour/
dsI/lib/domains/Ylsrim/broken/
dsI/lib/domains/Ylsrim/fish/
dsI/lib/domains/Ylsrim/meal/
dsI/lib/domains/Ylsrim/npc/
dsI/lib/domains/Ylsrim/virtual/
dsI/lib/domains/Ylsrim/weapon/
dsI/lib/domains/default/creator/
dsI/lib/domains/default/etc/
dsI/lib/domains/default/room/
dsI/lib/lib/comp/
dsI/lib/lib/lvs/
dsI/lib/lib/user/
dsI/lib/lib/virtual/
dsI/lib/obj/
dsI/lib/obj/include/
dsI/lib/realms/
dsI/lib/save/kills/a/
dsI/lib/save/kills/b/
dsI/lib/save/kills/f/
dsI/lib/save/kills/m/
dsI/lib/save/kills/q/
dsI/lib/save/kills/r/
dsI/lib/secure/cfg/
dsI/lib/secure/cfg/classes/
dsI/lib/secure/cfg/races/SCCS/
dsI/lib/secure/cmds/creators/include/
dsI/lib/secure/cmds/players/
dsI/lib/secure/cmds/players/include/
dsI/lib/secure/daemon/include/
dsI/lib/secure/lib/
dsI/lib/secure/lib/include/
dsI/lib/secure/lib/net/
dsI/lib/secure/lib/net/include/
dsI/lib/secure/lib/std/
dsI/lib/secure/obj/
dsI/lib/secure/obj/include/
dsI/lib/secure/save/
dsI/lib/spells/
dsI/lib/verbs/admins/include/
dsI/lib/verbs/common/
dsI/lib/verbs/common/include/
dsI/lib/verbs/creators/
dsI/lib/verbs/creators/include/
dsI/lib/verbs/players/include/SCCS/
dsI/lib/verbs/rooms/
dsI/lib/verbs/rooms/include/
dsI/lib/www/
dsI/v22.2b14/
dsI/win32/
/*  /secure/cmds/player/suicide.c
 *  from the Dead Soulsr2 Object Library
 *  Allows players to obliterate their character
 *  created by Blitz@Dead Souls
 */
 
#include <lib.h>
#include <dirs.h>
#include <flags.h>
#include <privs.h>
#include <message_class.h>
 
inherit LIB_DAEMON;
 
static private void GetPassword(string input);
static private void GetYesOrNo(string input);
static private void EndSuicide(string who);
 
mixed cmd(string str) {
  string who;
  object ob;
 
  if( sizeof(str) ) return "Suicide does not require any arguments.";
  ob = previous_object();
  if( this_player(1) != ob || !userp(ob) ) {
    log_file("security", "** Illegal suicide attempt **\n "
             "Call stack:\n"+ sprintf("%O\n", previous_object(-1)));
    return "Suicide failed.";
  }
  if( this_player()->GetForced() ) {
    log_file("security", "*** Illegal \"Forced\" Suicide **\n"
             "Call stack:\n"+ sprintf("%O\n", previous_object(-1)));
    return 0;
  }
  who = (string)this_player()->GetKeyName();
  if( who == "guest" ) return "Guest is not suicidal!";
  if( member_group(who, PRIV_SECURE) || member_group(who, PRIV_ASSIST) )
    return "You must first have your security privledges removed.";
  this_player()->eventPrint("Committing suicide means having your character "
           "completely erased from "+mud_name()+"'s database.  If you "
           "are certain this is what you want, enter in your correct "
           "password.  Otherwise enter in a wrong password.");
  this_player()->eventPrint("Password: ", MSG_EDIT);
  input_to((: GetPassword :), I_NOECHO | I_NOESC);
  return 1;
}
 
static private void GetPassword(string input) {
  string tmp;
  if( !sizeof(input) ) {
    this_player()->eventPrint("Suicide aborted.");
    return;
  }
  tmp = (string)this_player()->GetPassword();
  if( tmp != crypt(input, tmp) ) {
    this_player()->eventPrint("Wrong password.  Suicide aborted.");
    return;
  }
  this_player()->eventPrint("\nLeave a suicide note? (a)bort, (y)es, (N)o :",
                            MSG_EDIT);
  input_to((: GetYesOrNo :)); 
  return;
}

static private void GetYesOrNo(string input) {
  string tmp = (string)this_player()->GetKeyName();
  if( !sizeof(input) || (input = lower_case(input))[0] != 'y' ) {
     if( input && input[0] == 'a' ) {
        this_player()->eventPrint("Suicide has been aborted.");
        return;
     }
     EndSuicide(tmp);
     return;
  }
  this_player()->eventPrint("\nYou may now enter a letter "
          "explaining why you suicided.  If you do not wish to write a "
          "letter, simply exit the editor without writing anything. "
          "(enter \".\" on a blank line to exit editor.)");
  this_player()->eventEdit(DIR_TMP + "/" + tmp, (: EndSuicide, tmp :));
}
 
static private void EndSuicide(string who) {
  string tmp, file, newfile;
  object *ob;
 
  file = DIR_TMP + "/" + who;
  newfile = DIR_TMP + "/suicide/" + who;
  if( file_size(file) > 0 ) {
    tmp = possessive_noun(who)+" suicide note.\n"
          "Dated: "+ctime(time())+"\n";
    tmp += read_file(file);
    write_file(newfile, tmp, 1);
  }
  if( file_exists(file) ) rm(file);
  log_file("suicide", who+" suicided at "+ctime(time())
          +". (from "+query_ip_name(this_player())+")\n");
  tmp = save_file(who) + __SAVE_EXTENSION__;
  unguarded((: rename, tmp, DIR_SUICIDE + "/" + who + __SAVE_EXTENSION__ :));
  this_player()->eventPrint("You have suicided.  Please try " 
                "again another time.");
  environment(this_player())->eventPrint(
          (string)this_player()->GetName()+" has ended "+
          possessive(this_player())+" own life before your very eyes.",
          this_player() );
  if( sizeof( ob = filter(users(), (: archp :)) ) )
    ob->eventPrint("["+(string)this_player()->GetName()+" has "
                   "comitted suicide]");
  this_player()->eventDestruct();
  return;
}
 
string GetHelp(string str) {
    return "Syntax: suicide\n\n"
      "Ends your character's existence on "+mud_name()+" FOREVER.  "
      "It is non-reversible.  Once you issue this command, tyou will be asked"
      "for a password to confirm your identity.  Once password is confirmed, "
      "you will no longer exist in the MUD's database.  You may also opt "
      "to write a final suicide note.\n\n"
      "NOTE: If you suicide from a restricted site, you will have to "
      "reregister!";
}