#include <group_handler.h>
inherit GROUP_SUBCOMMAND_INHERITABLE;
int do_group_status( string verbose, string group );
int display_verbose_group_status( string group );
int display_brief_group_status( string group );
string calc_idle_string( object player );
string generate_status_message( object player );
string convert_percentage_to_colour( int percentage );
string convert_percentage_to_hp_message( int percentage );
string convert_percentage_to_gp_message( int percentage );
void create() {
::create();
add_group_sub_command( "status", "<word'brief|verbose'>",
(: do_group_status( $4[ 0 ], $6 ) :) );
add_group_sub_command( "status", "",
(: do_group_status( "default", $6 ) :) );
set_membership_required( "status", 0, 1 );
} /* create() */
int do_group_status( string verbose, string group ) {
int use_verbose;
switch( verbose ) {
case "default":
use_verbose = this_player()->query_verbose( "score" );
break;
case "verbose":
use_verbose = 1;
break;
case "brief":
use_verbose = 0;
break;
default:
return notify_fail( "[ERROR]: Unknown return value from verbose information.\n" );
}
switch( use_verbose ) {
case 1:
return display_verbose_group_status( group );
case 0:
return display_brief_group_status( group );
default:
return notify_fail( "[ERROR]: This shouldn't happen.\n" );
}
} /* do_group_status() */
int display_verbose_group_status( string group ) {
int size, cols;
object member, *members, *assisting;
string pronoun, message, status, short, colour, idle;
cols = this_player()->query_cols();
short = GROUP->query_group_short( group );
colour = this_player()->colour_event( GROUP_COLOUR_EVENT, "" );
message = "\n";
message += sprintf( " %'+'*|s\n", cols - 3, "|" + short + "|" );
size = sizeof( message ) - 3;
message = replace( message, ({ short, ( colour + short +
"%^RESET%^" ) }) );
message += "\n";
message += sprintf( "%' '*|s\n",
cols - 3,
"The group was started on " +
ctime( GROUP->query_start_time( group ) ) + "." );
message += "\n";
members = GROUP->members_of( group );
message += sprintf( " %-=*s\n\n",
size, "The group has %^BOLD%^" + query_num( sizeof( members ) ) +
"%^RESET%^ " + ( sizeof( members ) > 1 ? "members" : "member" ) +
":" );
foreach( member in members ) {
if(!member)
continue;
status = "$I$+8,+0= " + colour;
status += capitalize( member->query_cap_name() ) + "%^RESET%^" +
" is " + generate_status_message( member ) + " ";
pronoun = member->query_pronoun();
idle = calc_idle_string( member );
if( idle ) {
status += " %^BOLD%^" + idle + ".%^RESET%^";
}
if( member == GROUP->leader_of( group ) ) {
status += " " + capitalize( pronoun ) + " is the " +
colour + "current leader%^RESET%^ of the group.";
}
assisting = member->query_assisting();
if( sizeof( assisting ) ) {
status += " " + capitalize( pronoun ) + " is assisting " +
query_multiple_short( assisting ) + ".";
}
status += "$I$-8,-0=\n";
message += status;
}
tell_object( this_player(), message );
return 1;
} /* display_verbose_group_status() */
int display_brief_group_status( string group ) {
object member, *others;
string message, colour, idle;
int my_gp, my_hp, my_max_hp, my_max_gp;
message = "";
colour = this_player()->colour_event( GROUP_COLOUR_EVENT, "" );
others = GROUP->members_of( group ) - ({ this_player() });
my_hp = this_player()->query_hp();
my_gp = this_player()->query_gp();
my_max_hp = this_player()->query_max_hp();
my_max_gp = this_player()->query_max_gp();
message += colour;
message += capitalize( this_player()->query_cap_name() );
message += "%^RESET%^; Hp: " + convert_percentage_to_colour( my_hp * 100 / my_max_hp ) +
my_hp + "/" + my_max_hp + "%^RESET%^ Gp: " +
convert_percentage_to_colour( my_gp * 100 / my_max_gp ) +
my_gp + "/" + my_max_gp + "%^RESET%^.\n";
foreach( member in others ) {
message += colour;
message += capitalize( member->query_cap_name() );
message += "%^RESET%^ is " + generate_status_message( member );
idle = calc_idle_string( member );
if( idle ) {
message += " (" + idle + ")";
}
if( member == GROUP->leader_of( group ) ) {
message += " (" + colour + "L%^RESET%^)";
}
if( member->query_property( "dead" ) ) {
message += " (%^BOLD%^%^RED%^D%^RESET%^)";
}
message += "\n";
}
tell_object( this_player(), message );
return 1;
} /* display_brief_group_status() */
string calc_idle_string( object player ) {
int idle;
if( !interactive( player ) ) {
return "Net Dead";
}
idle = query_idle( player );
if( idle < 15 ) {
return 0;
}
return "Idle: " + ( idle / 60 ) + ":" + sprintf("%'0'2d", ( idle % 60 ));
} /* calc_idle_string() */
string generate_status_message( object player ) {
int hp_percentage, gp_percentage;
hp_percentage = player->query_hp() * 100 / player->query_max_hp();
gp_percentage = player->query_gp() * 100 / player->query_max_gp();
return (
convert_percentage_to_colour( hp_percentage ) +
convert_percentage_to_hp_message( hp_percentage ) +
"%^RESET%^ and " +
convert_percentage_to_colour( gp_percentage ) +
convert_percentage_to_gp_message( gp_percentage ) +
"%^RESET%^." );
} /* generate_status_message() */
string query_help_string_for( string sub_command ) {
return "The status sub-command displays vital statistics "
"of your group's members. Depending on your brief "
"settings for \"score\", the command will either "
"show the verbose statistics or prompt a brief "
"display. You can also force either version by "
"adding the argument \"verbose\" or \"brief\".";
} /* query_help_string_for() */
string convert_percentage_to_colour( int percentage ) {
switch( percentage ) {
case -1000..10: return "%^BOLD%^%^RED%^";
case 11..20: return "%^RED%^";
case 21..30: return "%^ORANGE%^";
case 31..40: return "%^YELLOW%^";
case 41..50: return "%^MAGENTA%^";
case 51..60: return "%^CYAN%^";
case 61..70: return "%^BOLD%^%^CYAN%^";
case 71..80: return "%^GREEN%^";
case 81..90: return "%^BOLD%^%^GREEN%^";
case 91..100: return "%^BOLD%^%^WHITE%^";
default: return "";
}
} /* convert_percentage_to_colour() */
string convert_percentage_to_hp_message( int percentage ) {
switch( percentage ) {
case -1000..0: return "perfectly healthy, for a ghost";
case 1..5: return "near death";
case 6..10: return "critically wounded";
case 11..20: return "seriously wounded";
case 21..30: return "heavily wounded";
case 31..40: return "badly wounded";
case 41..50: return "wounded";
case 51..60: return "slightly wounded";
case 61..70: return "injured";
case 71..80: return "slightly injured";
case 81..89: return "slightly hurt";
case 90..94: return "scratched";
case 95..99: return "almost unhurt";
case 100: return "unhurt";
default: return "ERROR";
}
} /* convert_percentage_to_hp_message() */
string convert_percentage_to_gp_message( int percentage ) {
switch( percentage ) {
case 0..10: return "near unconscious";
case 11..20: return "severely fatigued";
case 21..30: return "highly fatigued";
case 31..40: return "very fatigued";
case 41..50: return "fatigued";
case 51..60: return "slightly fatigued";
case 61..70: return "confused";
case 71..80: return "slightly confused";
case 81..90: return "concentrated";
case 91..99: return "clear of mind";
case 100: return "refreshed";
default: return "ERROR";
}
} /* convert_percentage_to_gp_message() */
string convert_percentage_to_share_message( int percentage ) {
switch( percentage ) {
case 100: return "all";
case 95..99: return "almost all";
case 90..94: return "a very large portion";
case 80..89: return "a large portion";
case 70..79: return "a major portion";
case 60..69: return "an above average portion";
case 52..59: return "a slightly above average portion";
case 49..51: return "an average portion";
case 41..48: return "a slightly below average portion";
case 31..40: return "a below average portion";
case 21..30: return "a minor portion";
case 11..20: return "a small portion";
case 6..10: return "a very small portion";
case 1..5: return "a miniscule portion";
case 0: return "next to none";
default: return "an ERRONEOUS portion ";
}
} /* convert_percentage_to_share_message() */