/
LIB3/
LIB3/D/ADMIN/
LIB3/D/ADMIN/OBJ/
LIB3/D/ADMIN/ROOM/W/
LIB3/D/HOME/
LIB3/D/HOME/CITY/ARENA/
LIB3/D/HOME/CITY/ITEMS/
LIB3/D/HOME/CITY/POSTOFFI/
LIB3/DOC/
LIB3/GLOBAL/SPECIAL/
LIB3/GLOBAL/VIRTUAL/
LIB3/NET/
LIB3/NET/CONFIG/
LIB3/NET/DAEMON/CHARS/
LIB3/NET/GOPHER/
LIB3/NET/INHERIT/
LIB3/NET/OBJ/
LIB3/NET/SAVE/
LIB3/NET/VIRTUAL/
LIB3/OBJ/B_DAY/
LIB3/OBJ/HANDLERS/TERM_TYP/
LIB3/PLAYERS/B/
LIB3/PLAYERS/N/
LIB3/ROOM/
LIB3/SAVE/
LIB3/SAVE/BOARDS/
LIB3/SAVE/ENVIRON/
LIB3/SAVE/POST/
LIB3/STD/COMMANDS/SHADOWS/
LIB3/STD/CREATOR/
LIB3/STD/DOM/
LIB3/STD/EFFECTS/
LIB3/STD/EFFECTS/HEALING/
LIB3/STD/EFFECTS/OTHER/
LIB3/STD/EFFECTS/POISONS/
LIB3/STD/ENVIRON/
LIB3/STD/GUILDS/
LIB3/STD/LIQUIDS/
LIB3/STD/ROOM/
LIB3/STD/TRIGGER/SHADOW/
LIB3/W/
LIB3/W/BANNOR/
LIB3/W/NEWSTYLE/
/*      create_dom_creator.c

   Change log:

   Whenever - Creator unknown.
   12/19/92 - Modified by Godot to add eligible_creator().
   12/20/92 - Modified by Godot to fix yesterday's bugs.

 */

/*
   Prototype functions.
 */
int     create_creator( string name );
int     create_domain( string name, string lord );
int     demote_creator( string str );
status  eligible_creator( object player );

/*
   Functions.
 */
int     create_domain( string name, string lord )
{
    string  file;

    if( !high_programmer( geteuid( previous_object() ) ) ||
	    !interactive( previous_object() ) )
	return 0;
    if( high_programmer( capitalize( name ) ) )
    {
	write( "Invalid name....\n" );
	return 0;
    }
    if( file_size( "/d/" + name ) != -1 )
    {
	write( "Domain already exists (or invalid).\n" );
	return 0;
    }
    if( sizeof( explode( name, "/" ) ) > 1 )
    {
	write( "Invalid to have a / in the domain name.\n" );
	return 0;
    }
    if( !"/secure/login"->test_creator( lord ) )
    {
	write( "The lord must exist.... and be a creator already.\n" );
	return 0;
    }
    mkdir( "/d/" + name );
    add_lord( lord );
    file = read_file( "/std/dom/master.c" );
    write_file( "/d/" + name + "/master.c", "#define LORD \"" + lord + "\"\n" );
    write_file( "/d/" + name + "/master.c", "#define DOMAIN \"" + name + "\"\n" );
    write_file( "/d/" + name + "/master.c", file );
    file = read_file( "/std/dom/common.c" );
    write_file( "/d/" + name + "/common.c",
		"#define DOM_TITLE \"the domain of " + name + "\"\n" );
    write_file( "/d/" + name + "/common.c", "#define LORD \"" + lord + "\"\n" );
    write_file( "/d/" + name + "/common.c", "#define DOMAIN \"" + name + "\"\n" );
    write_file( "/d/" + name + "/common.c", file );
    file = read_file( "/std/dom/loader.c" );
    write_file( "/d/" + name + "/loader.c", "#define DOMAIN \"" + name + "\"\n" );
    write_file( "/d/" + name + "/loader.c", file );
    save_object( "/secure/master" );
    write( "Created domain " + name + ".\n" );
    log_file( "PROMOTIONS", "Domain " + name + " created with a lord of " + lord +
	      " by " + geteuid( previous_object() ) + "\n" );
    return 1;
}				/* create_domain() */

int     create_creator( string name )
{
    string  file;

    seteuid( "Root" );
    if( !query_lord( geteuid( previous_object() ) )
	    || !interactive( previous_object() ) )
	return 0;
    if( !"/secure/login"->test_user( name ) )
	return 0;
    if( file_size( "/w/" + name ) != -1 )
    {
	write( "Directory already exists or something.\n" );
	/* 
	   change here by bill so that u can repromote the player without rming the dir!
	 */
	find_player( name )->set_creator( 1 );
	find_player( name )->save();
	return 1;
    }
    mkdir( "/w/" + name );
    file = read_file( "/std/creator/workroom.c" );
    write_file( "/w/" + name + "/workroom.c", "#define CREATOR \"" + name + "\"\n" );
    write_file( "/w/" + name + "/workroom.c", file );
    log_file( "PROMOTIONS", name + " promoted to creator by " +
	      geteuid( previous_object() ) + "\n" );
    write( "Creator " + name + " promoted.\n" );
    if( find_player( name ) )
    {
	find_player( name )->set_creator( 1 );
	find_player( name )->save();
	tell_object( find_player( name ), "You have been promoted to creator by " +
		     geteuid( previous_object() ) + ".\n" );
	tell_object( find_player( name ),
		     "You have been given a set of instructions to peruse\n"
		     + "in your own good time, but please don't be afraid to\n"
		     + "ask should you need any help.\n" );
	clone_object( "/w/newstyle/instruct.c" )->move( find_player( name ) );
    }
    else
    {
	write_file( "/players/" + name[ 0..0 ] + "/" + name + ".o", "creator 1\napp_creator 1\n" );
    }
    return 1;
}				/* create_creator() */

int     demote_creator( string str )
{
    string  name, reason;

    if( !query_lord( geteuid( previous_object() ) ) ||
	    !interactive( previous_object() ) )
	return 0;
    if( sscanf( str, "%s %s", name, reason ) != 2 )
    {
	notify_fail( "You need to give a reason!\n" );
	return 0;
    }
    if( !"/secure/login"->test_creator( name ) )
	return 0;
    if( query_lord( name ) )
    {
	write( "Cannot demote lords.\n" );
    }
    write_file( "/log/DEMOTE", name + " demoted by " +
		previous_object()->query_cap_name() + " at " + ctime( time() ) +
		"\nReason: " + reason + "\n" );
    if( find_player( name ) )
    {
	find_player( name )->set_creator( 0 );
	find_player( name )->save();
	tell_object( find_player( name ),
		     "You have just been demoted by " +
		     previous_object()->query_cap_name() + ", whos been a naught " +
		     "person then?\n" );
    }
    else
	write_file( "/players/" + name[ 0..0 ] + "/" + name + ".o",
		    "creator 0\napp_creator 0\n" );
    write( "Creator " + name + " demoted.\n" );
    return 1;
}				/* demote_creator() */

status
eligible_creator( object player )
{
    int     age;
    string  age_str;
    int     level;
    string  reasoning;

//  Why isn't write() columnizing for this object????  I'm forced to put
    //  in my own newlines.  Hopefully, no one has a <79 column terminal.

    reasoning =
	"  You do not have a *right* to create here.  In order to enhance your\n"
	+ "chances to be promoted, you should demonstrate by your actions that you\n"
	+ "are worthy.\n"
	+ "  If our Creators find lots of your bug, typo, and idea reports in their\n"
	+ "directories, then your chances are improved.  If you have been a trouble-\n"
	+ "maker here, your chances are very slim.  Harrassing the Lords for a\n"
	+ "position will not help your chances either.\n"
	+ "  Having access to a MUD's file system is a great responsibility.  It\n"
	+ "cannot be given out to strangers who have not demonstrated their trust-\n"
	+ "worthiness.  After investing a fair amount of your time and energy in\n"
	+ "playing at DiscWorld, you are less likely to try to hurt it.  This is\n"
	+ "why we cannot give out instant creatorships unless we know you from\n"
	+ "elsewhere.  Please try to be understanding about our policy.\n\n";

    age = -((int)player->query_time_on());
    level = player->query_level();

    if( (level >= 100) && (age > 86400) )
    {
	write( 
		  "  You have achieved the *minimum* requirements necessary to apply for a\n"
		  + "creatorship at DiscWorld.  You must now pass a review of the Lords to be\n"
		  + "accepted.\n"
		  + reasoning );
	return 1;
    }
/*
   Player does not qualify.  Tell him why.
 */
    age_str = "";

    if( age > 86400 )
	age_str += sprintf( "%d day", age / 86400 );
    if( age > 172800 )
	age_str += "s";

    if( age % 86400 > 3600 )
    {
	if( age > 86400 )
	    age_str += " and ";

	age_str += sprintf( "%d hour", ( age % 86400 ) / 3600 );
    }
    if( age % 86400 > 7200 )
	age_str += "s";

    write( 
	      "  The *minimum* requirements to apply for a creatorship at DiscWorld are\n"
	      + "an overall level of 100 from your guild and an age of at least one day.\n"
	      + "Your current level is " + level + " and your age is " + age_str + ".\n"
	      + reasoning );
    return 0;
}
/* eligible_creator() */

/* EOF */