#include <config.h>
#include "defs.h"
/* inherit "/std/dom/cmn_mas";
* being a common room, this should inherit the previous, but since that's
* basically a piece of shit, I won't have it contaminate my nice room:)
*/
inherit ROOM_OBJ;
#define HANDLER (LEARNING +"handlers/request")
object board;
object *chairs; /* people sitting */
void setup() {
set_light( 100 );
set_short("somewhat boring commonroom of the learning domain");
set_determinate("the ");
set_long("This is the common room of the domain of learning, the place "
"where creators come to learn. It is a somewhat boring room "
"except for some chairs strewn around the place which happen to "
"be an example of having commands defined in add_items, and some "
"sort of list hanging on the wall which is an example of using "
"add_command in rooms.\n");
add_item("chair", ({"long", "This chair looks comfortable, perhaps you "
"can sit in it.", "sit", ({ TO, "do_sit", "[in] <direct:object>"})
}), 1 );
add_item("chairs", ({"long", "These chairs look comfortable, perhaps you "
"can sit in one of them.", "sit", ({ TO, "do_sit",
"[in] <direct:object>"}) }), 1 );
add_item("list",
"This list has several actions associated with it:\n"
"\"show list\" will show the current requests.\n"
"\"request documentation\" will ask for "
"documentation on something.\n"
"\"request example\" will ask for an example of "
"something to be coded.\n"
"\"claim <number>\" is use to claim a request, thereby attempting "
"to make sure that only one creator is writing the documentation/"
"coding the examples.");
add_exit("entrance", __DIR__+"main", "path" );
add_exit("pub", CONFIG_START_LOCATION, "path" );
/* make all chairs empty */
chairs = ({ });
/* calling this result in the function extra_look() being called whenever
* people look at the room */
add_extra_look(TO);
/* the normal add_property() calls for the learning domain */
add_property("commented functions", ({ "add_extra_look", "extra_look",
"remove_extra_look", "add_command" }) );
add_property("keywords", ({ "room", "add_item", "action" }) );
/* make a copy of the domain's board */
board = clone_object(BOARD_OBJ);
board->set_datafile( DOMAIN );
board->move( TO );
} /* setup() */
int do_show( string words ) {
write( HANDLER->query_list() );
return 1;
} /* do_show() */
int do_claim( int i ) {
if( HANDLER->claim_request( TP->query_name(), i ) ) {
add_succeeded_mess("$N claim$s a request.\n");
return 1;
}
add_failed_mess("Illegal request number.\n");
return 0;
} /* do_claim() */
int do_remove( int i ) {
if( HANDLER->remove_request( TP->query_name(), i ) ) {
add_succeeded_mess("$N remove$s a request.\n");
return 1;
}
add_failed_mess("You can't remove that request.\n");
return 0;
} /* do_remove() */
int do_request( string words, int doc ) {
if( doc ) {
HANDLER->add_request( TP->query_name(), "documentation for "+words );
add_succeeded_mess("$N request$s some documentation.\n");
return 1;
}
HANDLER->add_request( TP->query_name(), "examples of "+ words );
add_succeeded_mess("$N request$s some examples.\n");
return 1;
} /* do_request() */
void init() {
::init();
add_command("show", "list");
add_command("claim", "request <number>", (: do_claim( $4[0] ) :) );
add_command("remove", "request <number>", (: do_claim( $4[0] ) :) );
add_command("request", "examples of <string'text'>",
(: do_request( $4[0], 0 ) :) );
add_command("request", "documentation for <string'text'>",
(: do_request( $4[0], 1 ) :) );
} /* init() */
int do_sit( string command, object *indir, string dir_match,
string indir_match, mixed *args, string pattern ) {
/* Note! I use add_succeeded_mess even though the command failed,
* because it fails for another reason than being the wrong object.
* This make it work even though there is a "sit" soul.
*/
if( dir_match == "chairs" ) {
add_succeeded_mess( ({"How can you sit on more than one chair at the "
"same time?\n", ""}) );
return 1;
}
if( member_array( TP, chairs ) != -1 ) {
add_succeeded_mess( ({"You are already sitting in a chair.\n",
""}) );
return 1;
}
/* add the player to the list of people in the chairs */
chairs += ({ TP });
/* calling add_extra_look() result in the function extra_look being
* called whenever people look at the person */
TP->add_extra_look( TO );
add_succeeded_mess("$N $V in a "+dir_match+".\n");
return 1;
} /* do_sit() */
string extra_look( object thing ) {
if( thing == TO ) { /* we're looking at the room */
/* remove people who have logged out and those who have left */
chairs = filter( chairs, (: $1 && ENV($1) == TO :) );
/* none left sitting */
if( !sizeof( chairs ) )
return "";
if( sizeof( chairs ) == 1 ) { /* only one left */
if( chairs[ 0 ] == TP ) { /* and it's you */
return "You are sitting in one of the chairs.\n";
} else { /* and it's someone else */
return (string)chairs[ 0 ]->the_short()+" is sitting in "
"one of the chairs.\n";
}
} else {
return query_multiple_short( chairs, "the")+" are sitting in "
"the chairs.\n";
}
}
/* we're looking at someone who might be sitting */
if( member_array( thing, chairs ) != -1 ) {
/* sitting and here */
if( ENV(thing) == TO )
return thing->HE+" is lazing around in a chair.\n";
}
/* calling remove_extra_look() stop extra_look() being
* called whenever people look at the thing */
thing->remove_extra_look( TO );
/* show nothing */
return "";
} /* extra_look() */