/* * SCB_ParsePlayerStats */ static void SCB_ParsePlayerStats( const char **s ) { int i, j, weak, strong; int shot_weak, hit_weak, shot_strong, hit_strong, hit_total, shot_total; unsigned int playerNum; if( !s || !*s ) return; playerNum = CG_ParseValue( s ); if( cg.frame.playerState.POVnum != playerNum + 1 ) return; memset( scb_player_stats, -1, sizeof( scb_player_stats ) ); j = 0; #define STATS_PERCENT(hit,total) ((hit) > 0 ? ((hit) == (total) ? 100 : (min( (int)( floor( ( 100.0f*(hit) ) / ( (float)(total) ) + 0.5f ) ), 99 ))) : -1) for( i = WEAP_GUNBLADE; i < WEAP_TOTAL; i++ ) { weak = j++; strong = j++; // total shot_total = CG_ParseValue( s ); if( shot_total == 0 ) continue; hit_total = CG_ParseValue( s ); shot_strong = shot_total; hit_strong = hit_total; if( i == WEAP_LASERGUN || i == WEAP_ELECTROBOLT ) { // strong shot_strong = CG_ParseValue( s ); if( shot_strong != shot_total ) hit_strong = CG_ParseValue( s ); } // weak shot_weak = shot_total - shot_strong; hit_weak = hit_total - hit_strong; scb_player_stats[weak] = STATS_PERCENT(hit_weak,shot_weak); scb_player_stats[strong] = STATS_PERCENT(hit_strong,shot_strong); } #undef STATS_PERCENT }
/* * CG_SC_PrintPlayerStats */ static void CG_SC_PrintPlayerStats( const char *s, void ( *pp ) ) { int playerNum; int i, shot_weak, hit_weak, shot_strong, hit_strong, hit_total, shot_total; int total_damage_given, total_damage_received, health_taken, armor_taken; gsitem_t *item; void ( *print )( const char *format, ... ) = pp; playerNum = CG_ParseValue( &s ); if( playerNum < 0 || playerNum >= gs.maxclients ) return; // print stats to console/file print( "Stats for %s" S_COLOR_WHITE ":\r\n\r\n", cgs.clientInfo[playerNum].name ); print( " Weapon Weak Strong\r\n" ); print( " hit/shot percent hit/shot percent hit/shot percent\r\n" ); for( i = WEAP_GUNBLADE; i < WEAP_TOTAL; i++ ) { item = GS_FindItemByTag( i ); assert( item ); shot_total = CG_ParseValue( &s ); if( shot_total < 1 ) // only continue with registered shots continue; hit_total = CG_ParseValue( &s ); shot_strong = CG_ParseValue( &s ); hit_strong = (shot_strong != shot_total ? CG_ParseValue( &s ) : hit_total); shot_weak = shot_total - shot_strong; hit_weak = hit_total - hit_strong; // name print( "%s%2s" S_COLOR_WHITE ": ", item->color, item->shortname ); #define STATS_PERCENT(hit,total) ((total) == 0 ? 0 : ((hit) == (total) ? 100 : (float)(hit) * 100.0f / (float)(total))) // total print( S_COLOR_GREEN "%3i" S_COLOR_WHITE "/" S_COLOR_CYAN "%3i " S_COLOR_YELLOW "%2.1f", hit_total, shot_total, STATS_PERCENT( hit_total, shot_total ) ); // weak print( " " S_COLOR_GREEN "%3i" S_COLOR_WHITE "/" S_COLOR_CYAN "%3i " S_COLOR_YELLOW "%2.1f", hit_weak, shot_weak, STATS_PERCENT( hit_weak, shot_weak ) ); // strong print( " " S_COLOR_GREEN "%3i" S_COLOR_WHITE "/" S_COLOR_CYAN "%3i " S_COLOR_YELLOW "%2.1f", hit_strong, shot_strong, STATS_PERCENT( hit_strong, shot_strong ) ); print( "\r\n" ); } print( "\r\n" ); total_damage_given = CG_ParseValue( &s ); total_damage_received = CG_ParseValue( &s ); print( S_COLOR_YELLOW "Damage given/received: " S_COLOR_WHITE "%i/%i " S_COLOR_YELLOW "ratio: %s%3.2f\r\n", total_damage_given, total_damage_received, ( total_damage_given > total_damage_received ? S_COLOR_GREEN : S_COLOR_RED ), STATS_PERCENT( total_damage_given, total_damage_given + total_damage_received ) ); health_taken = CG_ParseValue( &s ); armor_taken = CG_ParseValue( &s ); print( S_COLOR_YELLOW "Health/Armor taken : " S_COLOR_CYAN "%i" S_COLOR_WHITE "/" S_COLOR_CYAN "%i\r\n", health_taken, armor_taken ); #undef STATS_PERCENT }