/*
// File     :  /domains/Praxis/court_room.c
// Comment  :  The Court where High Justice is served.
// 94-07-02 :  Pallando @ Nightmare wrote it
*/
#include <lib.h>
#include <rooms.h>
#include <council.h>

#define COUNCIL_CHAMBER "/domains/Praxis/council"

inherit LIB_ROOM;

object defendant;

void create()
{
    ::create();
    SetProperties( ([
        "indoors" : 1,
        "light" : 2,
        "no castle" : 1,
        "no teleport" : 1,
        "no bump" : 1,
        "no attack" : 1,
        "no steal" : 1,
        "no magic" : 1,
      ]) );
    SetShort( "the court of high justice" );
    // Thank you, whoever added this.  However, if you have time, I have
    // a few suggestions:
    //   We want the justice system to be intimidating.  Imagine being a
    //   short dwarf.  You have been lead up from a dank stone dungeon.
    //   you peer up at the dark oak furnishings (the dock has omnious
    //   scratches left on by the last victim dragged away for execution)
    //   the flickering torches leave frightning looming dark heights to
    //   the room, while leaving the dock harshly lit.  The judges bench
    //   it tall, imposing, richly ornamented in legal symbols (an iron
    //   glove enclosing an iron fist).  UNderneath it is a supply of gin.
    //   The place smells slightly of chalk dust used for lawyer's wigs,
    //   and the perspiration of bored and jeering juiries.  The stone
    //   fllor flagstones boom ominously every time the usher bangs his
    //   staff to summon the next witness.  A hanging on the wall, 
    //   embroidered by the housewifes union depicts the possible sentances
    //   in gory detail.  Occasional screams can be heard from the prison
    //   or execution square.
    //
    //   You could also use interactive SetItems to show if the dock and
    //   bench are currently occupied.
    SetLong(
      "The sheer size of this room dazzles you.  The ceiling cannot be viewed\n"+
      "from where you stand.  At one end of the room is a huge chair, in front\n"+
      "of which is a desk.  Both the chair and the desk are made from the finest\n"+
      "wood in the land.  Next to the desk lies a second chair, where witnesses\n"+
      "sit.  On the other side of the room are rows of chairs, and an aisle\n"+
      "through the center.  Two doors lead the way out of this room, north\n"+
      "is the Town Hall, east is the sheriff's office.\n"
    );
    SetExits( ([
        "north" : "/domains/Praxis/town_hall",
        "east"  : "/domains/Praxis/sheriff",
      ]) );
    SetItems( ([
        "view" : "A magnificent panorama of all Praxis.",
        "gavel" : "A wooden hammer-like object, used for pounding.",
        "chair" : "Made out of the finest wood.",
        "desk" : "A large desk made out of the finest wood.",
        ({ "door", "doors" }) :
        "Large wooden doors leading out of the room.",
        "ceiling" : "The ceiling extends out of view.",
        "room" : "A very large, spacious room with a "
        "rather formal aura.",
        "office" : "The office of the Sheriff of Praxis.",
        "wood" : "The highest quality wood, made exclusivly "
        "from the trees of the elven forest.",
      ]) );
}

varargs int justicep( mixed arg )
{
    if( !arg ) arg = this_player();
    if( objectp( arg ) ) arg = geteuid( arg );
    return -1 != member_array( arg, JUSTICES) || member_array( arg, POLICECOM );
}

int release_objects( object ob )
{
    return ob != defendant;
}

void init()
{
    add_action( "cmd_law", "law" );
    ::init();
    if( !creatorp( this_player() ) && !justicep( this_player() ) )
        return;
    add_action( "cmd_summon", "summon" );
    add_action( "cmd_verdict", "verdict" );
    add_action( "cmd_sentence", "sentence" );
}

int cmd_law( string title )
{
    return COUNCIL_CHAMBER-> cmd_law( title );
}


int cmd_summon( string arg )
{
    object victim;

    if( !arg )
        return notify_fail( "Syntax: summon <player name>\n" );
    //call_other( ROOM_SHERIFF, "sighs_for_deleted_simul_efun_f.o.o.l." );
    if( victim = present( arg, this_object() ) )
    {
        if( victim == defendant )
            return notify_fail( arg + " is already in the dock.\n" );
    } 
    //else if( victim = present( arg, find_object( ROOM_SHERIFF ) ) ) {
    //	ROOM_SHERIFF-> remove_prisoner( victim );
    //	victim-> eventMove( this_object() );
    //   } 
    else notify_fail( "The sheriffs do not have " + arg + ".\n" );
    if( defendant )
        tell_object( defendant, "You trial is suspended.  You may leave.\n" );
    defendant = victim;
    say( defendant-> query_cap_name() + " is summoned to the dock.\n" );
    return 1;
}

int cmd_verdict( string arg )
{
    if( !arg )
        return notify_fail( "Syntax: verdict guilty|innocent|none\n" );
    if( !defendant )
        return notify_fail( "You must summon a defendant first.\n" );
    switch( arg )
    {
    case "innocent":
    case "free":
    case "insufficient evidence":
        say( "VERDICT: the defendant is found to be Not Guilty.\n" );
        defendant-> set_outlaw( 0 );
        defendant = 0;
        break;
    case "guilty":
        say( "VERDICT: the defendant is Guilty.\n" );
        defendant-> set_outlaw( 1 );
        break;
    case "none":
    default:
        say( "VERDICT: no change in the defendant's status\n" );
        defendant = 0;
        break;
    }
    return 1;
}

int cmd_sentence( string arg )
{
    mapping executions;
    object criminal;

    //executions = ROOM_SHERIFF-> valid_execution();
    executions = ([]);
    if( !arg || undefinedp( executions[arg] ) )
        return notify_fail(
          "Syntax: sentence <punishment>\nCurrent options:\n  "+
          implode( keys( executions ), "\n  " ) + "\n" );
    if( !defendant )
        return notify_fail( "You must summon a defendant first.\n" );
    say( sprintf( 
        "%s says: %s, you have been found guilty by due process\n"
        "  and now justice must be seen to be done.  It is the will of law that\n"+
        "  you shall now be taken from here unto the place of execution,\n"+
        "  where you shall suffer the torments of %s until dead.\n",
        this_player()-> query_cap_name(),
        defendant-> query_cap_name(),
        arg ) );

    criminal = defendant;
    defendant = 0;
    //ROOM_SHERIFF-> add_prisoner( criminal );
    //ROOM_SHERIFF-> execute( criminal, arg );

    return 1;
}


/* EOF */
