/* ** 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; }