/
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/
/*
** A creator-grade handler thing.
**
** Newstyle, 16/12/93
** Changed by Nivek, 5/12/94, because the thing to assign sponsors
** to people who are already sponsors is screwy.
**
** Goalposts moved ( grades entended ) by Newstyle, 24/5/94
** Titles added by Newstyle, 24/5/94
*/

#define SAVEFILE "/save/cre-grades"
#define SECURITY \
   if(!"/secure/master"->query_lord(geteuid(this_player())) )\
  {\
    log_file("ILLEGAL", this_player()->query_cap_name() +\
             " tried to adjust cre-grades at "+ctime(time())+".\n");\
    tell_object(this_player(), "You do not have permission "\
                               +"to alter cre-grades.\n");\
    return 0;\
  }

mapping grades, sponsor, titles;

void    create()
{
    seteuid( "Room" );
    restore_object( SAVEFILE, 1 );
    if( !grades )
	grades = ([ ]);
    if( !sponsor )
	sponsor = ([ ]);
   if( !titles )
      titles = ([ ]);
}

void    save_me()
{
    save_object( SAVEFILE, 1 );
}

void    dest_me()
{
    save_me();
    destruct( this_object() );
}

int     kill_creator( string creator )
{
    SECURITY
	if( !creator )
	return 0;
    if( sponsor[ creator ] )
	sponsor = m_delete( sponsor, creator );
    if( grades[ creator ] )
	grades = m_delete( grades, creator );
    save_me();
    return 1;
}

int     query_cre_grade( string creator )
{
    creator = lower_case( creator );
/*
   ** Security removed pending consideration.
   if(!this_player()->query_lord() &&
   file_name(previous_object())[0..6] != "/secure" &&
   (string)this_player()->query_name() != creator)
   {
   notify_fail("You do not have access to that information.\n");
   return 0;
   }
 */
    if( "/secure/master"->query_lord( creator ) )
    return 150;
    if( !"/secure/login"->test_creator( creator ) )
	return 0;
    if( !grades[ creator ] )
	grades[ creator ] = 1;
    return grades[ creator ];
}

int     set_cre_grade( string creator, int score )
{
    SECURITY

/* Check and see that the new score is valid */
    if( !"/secure/login"->test_creator( creator ) )
    {
	tell_object( this_player(), capitalize( creator ) +
		     " not a creator.\n" );
	return 1;
    }
    if( grades[ creator ] < 20 && score > 19 && !sponsor[ creator ] )
    {
	tell_object( this_player(), capitalize( creator ) +
		     " will need a sponsor before they can be promoted.\n" );
	return 1;
    }
    if( score > 19 && score >= query_cre_grade( sponsor[ creator ] ) )
    {
	tell_object( this_player(), "That would give " +
		     capitalize( creator ) + " more points than their sponsor, "
		     + capitalize( sponsor[ creator ] ) + ".\n" );
	return 1;
    }
    if( grades[ creator ] < 80 && score > 79 &&
        query_cre_grade( sponsor[ creator ] ) < 120  )
    {
	tell_object( this_player(), capitalize( creator ) +
             "'s sponsor must be an overseer before they" +
		     " can be promoted to sponsor.\n" );
	return 1;
    }
    if( grades[ creator ] < 120 && score > 119 &&
	    !"/secure/master"->query_lord( sponsor[ creator ] ) )
    {
	tell_object( this_player(), capitalize( creator ) +
             "'s sponsor must be a lord before they" +
             " can be promoted to overseer.\n" );
	return 1;
    }

/* Inform the changer if they have altered somebodies status */
    if( grades[ creator ] < 20 && score > 19 )
    {
	grades[ creator ] = score;
	save_me();
	tell_object( this_player(), capitalize( creator ) +
		     " is now a full creator.\n" );
	return 1;
    }
    if( grades[ creator ] < 20 && score > 19 )
    {
	grades[ creator ] = score;
	save_me();
	tell_object( this_player(), capitalize( creator ) +
		     " is now a full creator.\n" );
	return 1;
    }
    if( grades[ creator ] < 80 && score > 79 )
    {
	grades[ creator ] = score;
	save_me();
	tell_object( this_player(), capitalize( creator ) +
             " is now a sponsor.\n" );
	return 1;
    }
    if( grades[ creator ] < 120 && score > 119 )
    {
	grades[ creator ] = score;
	save_me();
	tell_object( this_player(), capitalize( creator ) +
             " is now an overseer.\n" );
	return 1;
    }
    if( score >= 150 )
    {
    grades[ creator->query_name() ] = 150;
	save_me();
	tell_object( this_player(), capitalize( creator ) +
             " now has 150 points, and should be promoted.\n" );
	return 1;
    }
/* They've maybe gone down a level */
    if( score <= 0 )
    {
	grades[ creator ] = 0;
	save_me();
	tell_object( this_player(), capitalize( creator ) +
		     " now has 0 points, and should be demoted.\n" );
	return 1;
    }
    if( grades[ creator ] > 19 && score < 20 )
    {
	grades[ creator ] = score;
	save_me();
	tell_object( this_player(), capitalize( creator ) +
		     " is no longer a full creator.\n" );
	return 1;
    }
    if( grades[ creator ] > 19 && score < 20 )
    {
	grades[ creator ] = score;
	save_me();
	tell_object( this_player(), capitalize( creator ) +
		     " is no longer a full creator.\n" );
	return 1;
    }
    if( grades[ creator ] > 79 && score < 80 )
    {
	grades[ creator ] = score;
	save_me();
	tell_object( this_player(), capitalize( creator ) +
             " is no longer a sponsor.\n" );
	return 1;
    }
    if( grades[ creator ] > 119 && score < 120 )
    {
	grades[ creator ] = score;
	save_me();
	tell_object( this_player(), capitalize( creator ) +
             " is no longer an overseer.\n" );
	return 1;
    }

/* Okay, nothing special happened. Just a normal grade change */
    grades[ creator ] = score;
    save_me();
    tell_object( this_player(), capitalize( creator ) +
		 " now has " + score + " points.\n" );
    return 1;
}

int     adjust_cre_grade( string creator, int score )
{
    return set_cre_grade( creator, score + query_cre_grade( creator ) );
}

string  query_cre_symbol( string creator )
{
    if ( master()->query_lord( creator ) )
        return ( master()->high_programmer( creator ) )? "H" : "L";
    switch( query_cre_grade( creator ) )
    {
    case 150:
        return "l";     /* Should be a lord */
    case 120..149:
        return "O";     /* Overseer */
    case 80..119:
        return "S";     /* Sponsor/Supervisor */
	case 40..79:
	    return "C";		/* Creator */
	case 20..39:
	    return "c";		/* Junior creator */
	case 1..19:
	    return "A";		/* Apprentice creator */
	case 0:
	    return "D";		/* Dunce - to be Demoted */
    }
    return "U";			/* Ungraded/Unknown/Unidentified */
}

string  query_cre_string( string creator )
{
    if ( master()->query_lord( creator ) )
        return ( master()->high_programmer( creator ) )?
               "a High Lord"  :  "a Lord";
    switch( query_cre_grade( creator ) )
    {
    case 150:
	    return "a lordling";
    case 120..149:
        return "an overseer";
    case 80..119:
	    return "a sponsor";
	case 40..79:
	    return "a full creator";
	case 20..39:
	    return "a junior creator";
	case 1..19:
	    return "an apprentice creator";
	case 0:
	    return "a dunce";
    }
    return "an unclassified person";
}

int     set_sponsor( string creator, string nsponsor )
{
    SECURITY
	if( !"/secure/login"->test_creator( creator ) )
    {
	tell_object( this_player(), capitalize( creator ) +
		     " not a creator.\n" );
	return 1;
    }
    if( grades[ creator ] > 79 &&
	    !"/secure/master"->query_lord( nsponsor ) )
    {
	tell_object( this_player(), capitalize( creator ) +
		     "'s sponsor must be a lord.\n" );
	return 1;
    }
    if( query_cre_grade( nsponsor ) < 80 )
    {
	tell_object( this_player(), capitalize( nsponsor ) +
		     " is not a high enough grade to be a sponsor.\n" );
	return 1;
    }
    sponsor[ creator ] = nsponsor;
    save_me();
    tell_object( this_player(), capitalize( creator ) +
		 "'s sponsor is now " + capitalize( nsponsor ) + ".\n" );
    return 1;
}

string  query_sponsor( string name )
{
    name = lower_case( name );
 if( query_cre_grade( (string)this_player()->query_name() ) < 80 &&
	    (string)this_player()->query_name() != name )
    {
	notify_fail( "You do not have access to that information.\n" );
	return 0;
    }
    if( !sponsor[ name ] )
	return "nobody";
    return sponsor[ name ];
}

string *sponsored_by( string name )
{
    string *peeps, *ret;
    int     i;

    peeps = keys( sponsor );
    ret = ({ });
    for( i = 0; i < sizeof( peeps ); i++ )
	if( sponsor[ peeps[ i ] ] == name )
	    ret += ({ peeps[ i ] });

    return ret;
}

int add_title( string name, string title )
{
    SECURITY

    if(!titles[ name ])
       titles[name] = ({ title });
    else
       titles[name] += ({ title });
    write("Title '"+title+"' added to "+capitalize(name)+".\n");
    return 1;
}

string query_titles( string name )
{
    if(!titles[ name ]) return 0;
    return titles[ name ];
}

string query_string_title( string name )
{
   if(!titles[ name ]) return 0;
   return implode(titles[name], ", ");
}

int remove_title( string name, mixed title)
/* Can specify title as a number or a string */
{
    SECURITY

    if(!titles[name]) return 0;
    if(intp(title))
      if(title < sizeof(titles[name]) && title >=0)
      {
         titles[name] = delete(titles[name], title, 1);
if(!sizeof(titles[name])) titles = m_delete(titles, name);
         write(capitalize(name)+"s title number "+title+" removed.\n");
         return 1;
      }
      else
      {
        notify_fail("Number out of range: Cannot remove title.\n");
        return 0;
      }
   if(stringp(title))
   {
      string *matches, junk;
      int i;

      matches = ({ });
      for(i=0;i<sizeof(titles[name]);i++)
       if(sscanf(titles[name][i], "%s"+title+"%s", junk, junk) == 2)
         matches += ({ titles[name][i] });
      if(!sizeof(matches))
      {
         notify_fail("No titles found matching "+title+".\n");
         return 0;
      }
      if(sizeof(matches) > 1)
      {
         notify_fail("Ambigous : More than one title matches '"+title+"'.\n");
         return 0;
      }
      titles[name] -= matches;
if(!sizeof(titles[name])) titles = m_delete(titles, name);
      write("Title '"+matches[0]+"' removed from "+capitalize(name)+".\n");
      return 1;
   }
   notify_fail("Second parameter to remove title must be int or string.\n");
   return 0;
}