// MorgenGrauen MUDlib
//
// death_room_vc.c -- Das Standardobjekt fuer den VC-Todesraum
//
// $Id: death_room_vc.c 8988 2014-12-31 13:10:19Z Zesstra $


#pragma strict_types

#include <defines.h>
#include <properties.h>
#include <moving.h>
#include <language.h>
#include <wizlevels.h>
#include <daemon.h>
#include <new_skills.h>

inherit "/std/room";

public int no_attack();
public int no_poison(int val);

public void create()
{
  if (IS_BLUE(this_object())) return;
    ::create();
    
    SetProp( P_GENDER, MALE );
    SetProp( P_ARTICLE, 0 );
    SetProp( P_LIGHT,1 );
    SetProp( P_NO_TPORT, NO_TPORT_OUT );
    SetProp( P_LOG_FILE, "TOD/Todesraum" );
    SetProp( P_INT_SHORT, "Arbeitszimmer des Todes" );
    SetProp( P_INT_LONG, break_string(
             "Ein dunkler Raum, erleuchtet von dunklem Licht, das sich der "
             "Dunkelheit nicht so sehr zu widersetzen scheint, indem es "
             "leuchtet, als dass es der dunkelste Punkt in einer weniger "
             "dunklen Umgebung ist. Im seltsamen Licht erkennst Du einen "+
             "zentral aufgestellten Schreibtisch, der mit Diagrammen und "
             "Buechern bedeckt ist. Die Waende verschwinden hinter Regalen, "
             "die gefuellt sind mit in Leder gebundenen, dunklen Waelzern, "
             "von denen geheimnisvolle Runen leuchten.\nTod.", 78, 0, 1 ) );
    previous_object()->CustomizeObject();
    call_other("/room/death/death_room","???");
}

void test_remove()
{
  if (!sizeof(all_inventory(this_object())&users()))
    if (!({int})this_object()->remove()) destruct(this_object());
}

public void reset()
{
  ::reset();
  test_remove();
  return;
}

public varargs void exit(object liv, object dest)
{
  call_out("test_remove",2);
  return;
}


static void deep_destruct( object ob )
{
  if ( objectp(ob) && environment(ob) == this_object() )
    filter(deep_inventory(ob) + ({ ob }), #'destruct);
}

public varargs void init(object oldenv)
{  
  string prayroom;
  int res;

  ::init(oldenv);
  if ( !query_once_interactive(this_player()) ){
      call_out( "deep_destruct", 0, this_player() );
      return;
  }

  if ( !(prayroom = ({string}) this_player()->QueryPrayRoom()) )
      prayroom = "/room/pray_room";
  
  if ( !({int})this_player()->QueryProp(P_GHOST) )
    {
      if ( IS_WIZARD(this_player()) &&
           ({int})this_player()->QueryProp(P_WANTS_TO_LEARN) )
	{
          if ( !({int})this_player()->QueryProp(P_INVIS) )
              tell_room( this_object(),
                         "Der Tod sagt: WAS WILLST DU HIER, "+
                         upperstring(({string})this_player()->name())+"?\n"+
                         "Der Tod sagt: DU BIST UNSTERBLICH, DU HAST HIER "
                         "NICHTS ZU SUCHEN!\n\n" );
	}
      else 
	{
          write("Der Tod sagt: WAS TUST DU HIER? DEINE ZEIT IST NOCH "
                "NICHT REIF!\n\n");
          
	  if ( catch(res = ({int}) this_player()->move( prayroom,M_GO|M_SILENT|M_NOCHECK ))
               || res < 1 && environment(this_player()) == this_object() )
              this_player()->move( "/room/pray_room", M_GO|M_SILENT|M_NOCHECK );
	}
      return;
    }

  if ( !IS_DEPUTY(this_player()) ){
    add_action( "filter_ldfied", "", 1 );
    this_player()->Set( P_TMP_MOVE_HOOK,
                        ({ time()+31536000, 
                           find_object("/room/death/death_room"), 
                           "hier_geblieben" }) );
  }

  this_player()->Set( P_NO_ATTACK, #'no_attack, F_QUERY_METHOD );
  this_player()->Set( P_POISON, #'no_poison, F_SET_METHOD );
  
  "/room/death/death_room"->add_player(this_player());
}

// public, da command_me() sonst buggt (Wurzels Speedy o.ae.)
public int filter_ldfied( string str )
{
    // Description:   Filter out relevant commands.
    string verb;
    
    verb=query_verb();
    
    if ( (verb == "schlafe" || verb == "schlaf") && str == "ein" ){
        write("DU KANNST DEM TOD NICHT ENTRINNEN!\n");
        return 0;
    }
    
    if ( verb == "typo" || verb == "fehler" || verb == "bug" || verb == "idee" )
        return 0;

    write( "Dein Koerper gehorcht Dir nicht !\n" );
    return 1;
}

public int no_attack()
{
  // Spieler haengt noch in der Todessequenz
  if( present(previous_object()) )
    return 1;
  else
    previous_object()->Set( P_NO_ATTACK, 0, F_QUERY_METHOD );

  return 0;
}

public int no_poison(int val)
{
  if ( val != 0 )
  {
    catch( raise_error("Poisoning dead players is illegal. Calling object "
      "was "+object_name(previous_object(1))+"\n");publish );
  }
  return 0;
}

