//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: Contains lots of stuff that really doesn't fit anywhere else. Including // the implementations of the various Util:: functions // // $Workfile: $ // $Date: $ // //------------------------------------------------------------------------------------------------------ // $Log: $ // // $NoKeywords: $ //=============================================================================// #include "util.h" #include "TFStatsApplication.h" #include #include #include using namespace std; //------------------------------------------------------------------------------------------------------ // Function: Util::string2svrID // Purpose: takes a string and extracts a server assigned ID out of it. // Input: s - the string from which to extract the server assigned ID // Output: int //------------------------------------------------------------------------------------------------------ int Util::string2svrID(string s) { const char* text=s.c_str(); const char* read=&text[strlen(text)-1]; while (read != text) { if (*read=='<' && *(read+1) != 'W') // if we've found a svrID break; read--; } if (read==text) return -1; int retval=-1; sscanf(read,"<%i>",&retval); return retval; } //friendly weapon names so users don't have to look at names like "gl_grenade" map Util::frWeapNmTbl; void Util::initFriendlyWeaponNameTable() { frWeapNmTbl["gl_grenade"]="Grenade Launcher"; frWeapNmTbl["pipebomb"]="Pipebombs"; frWeapNmTbl["timer"]="Infection"; frWeapNmTbl["ac"]="Assault Cannon"; frWeapNmTbl["infection"]="Infection"; frWeapNmTbl["flames"]="Flames"; frWeapNmTbl["rocket"]="Rocket Launcher"; frWeapNmTbl["sentrygun"]="Sentry Gun"; frWeapNmTbl["sniperrifle"]="Sniper Rifle"; frWeapNmTbl["headshot"]="Head Shot"; frWeapNmTbl["knife"]="Combat Knife"; frWeapNmTbl["nails"]="Nail Gun"; frWeapNmTbl["axe"]="Crowbar"; frWeapNmTbl["shotgun"]="Shotgun"; frWeapNmTbl["autorifle"]="Auto Rifle"; frWeapNmTbl["supershotgun"]="Super Shotgun"; frWeapNmTbl["supernails"]="Super Nailgun"; frWeapNmTbl["railgun"]="Rail Gun"; frWeapNmTbl["spanner"]="Spanner"; //grenades frWeapNmTbl["caltrop"]="Caltrops"; frWeapNmTbl["mirvgrenade"]="MIRV Grenade"; frWeapNmTbl["nailgrenade"]="Nail Grenade"; frWeapNmTbl["normalgrenade"]="Hand Grenade"; frWeapNmTbl["gasgrenade"]="Gas Grenade"; frWeapNmTbl["empgrenade"]="EMP Grenade"; } //------------------------------------------------------------------------------------------------------ // Function: getFriendlyWeaponName // Purpose: turns a non-friendly weapon name into a friendly one // Input: s - the non-friendly weapon name which you want to make friendly // this function returns the non friendly name if the friendly one isn't found // Output: const string& //------------------------------------------------------------------------------------------------------ const string& Util::getFriendlyWeaponName(const string& s) { if (frWeapNmTbl[s] == "") return s; else return frWeapNmTbl[s]; } //map of team colors, indexed by team ID const char* Util::teamcolormap[]= { {"blue"}, {"red"}, {"yellow"}, {"green"}, }; //friendly english stuff char* Util::Months[]= { //{""}, {"January"}, {"February"}, {"March"}, {"April"}, {"May"}, {"June"}, {"July"}, {"August"}, {"September"}, {"October"}, {"November"}, {"December"} }; char* Util::numberSuffixes[]= { {"th"}, {"st"}, {"nd"}, {"rd"} }; char* Util::daysofWeek[]= { {"Sunday"}, {"Monday"}, {"Tuesday"}, {"Wednesday"}, {"Thursday"}, {"Friday"}, {"Saturday"} }; char* Util::ampm[]= { {"am"}, {"pm"} }; //english names, indexed by enumeration player_class in util.h char* plrClassNames[]={ {"Undefined"}, {"scout"}, {"sniper"}, {"soldier"}, {"demoman"}, {"medic"}, {"hwguy"}, {"pyro"}, {"spy"}, {"engineer"}, {"civilian"}, {"RandomPC"}, {"observer"}, }; #define NUM_CLASSES 12 //------------------------------------------------------------------------------------------------------ // Function: playerClassNameToClassID // Purpose: determines the classID for the given class Name and returns it // Input: plrClass - the name of the class. // Output: player_class //------------------------------------------------------------------------------------------------------ player_class playerClassNameToClassID(const char* plrClass) { for (int i=0;itm_hour; } //------------------------------------------------------------------------------------------------------ // Function: Util::time_t2mins // Purpose: returns how many minutes of the hour are in the given time. // Input: tmr - the time to convert // Output: int //------------------------------------------------------------------------------------------------------ int Util::time_t2mins(time_t tmr) { tm* pstart=gmtime(&tmr); if (!pstart) return 0; return pstart->tm_min; } //------------------------------------------------------------------------------------------------------ // Function: Util::time_t2secs // Purpose: returns how many seconds of the minute are in the given time // Input: tmr - the time to convert // Output: int //------------------------------------------------------------------------------------------------------ int Util::time_t2secs(time_t tmr) { tm* pstart=gmtime(&tmr); if (!pstart) return 0; return pstart->tm_sec; } //------------------------------------------------------------------------------------------------------ // Function: str2lowercase // Purpose: portable _strlwr. linux doesn't support _strlwr // Input: out - destination of lower case string // in - string to lowercasify //------------------------------------------------------------------------------------------------------ void Util::str2lowercase(char* out , const char* in) { while(*in) { *(out++)=tolower(*in++); } *out=0; } //#define _DIRDEBUG void Util::debug_dir_printf(char* fmt,...) { #ifdef _DEBUG #ifdef _DIRDEBUG va_list v; va_start(v,fmt); vfprintf(stdout,fmt,v); #endif #endif } const char* Util::makeDurationString(time_t start, time_t end,char* out,char* tostr) { //TODO: //handle case where start and end dates are not the same day tm* pstart=localtime(&start); if (!pstart) { sprintf(out,""); return out; } int sday=pstart->tm_mday; int sweekday=pstart->tm_wday; int smo=pstart->tm_mon; int syear=pstart->tm_year+1900; int shour=pstart->tm_hour; if (pstart->tm_isdst) shour=(shour+23)%24; //this substracts 1 while accounting for backing up past 0 int smin=pstart->tm_min; tm* pend=localtime(&end); if (!pend) pend=pstart; int ehour=pend->tm_hour; int emin=pend->tm_min; if (pend->tm_isdst) ehour=(ehour+23)%24; //this substracts 1 while accounting for backing up past 0 char* matchtz=NULL; matchtz=g_pApp->os->gettzname()[0]; sprintf(out,"%02li:%02li%s%02li:%02li %s, %s %s %li%s %li",shour,smin,tostr,ehour,emin,matchtz, Util::daysofWeek[sweekday],Util::Months[smo],sday,(sday%10)<4?Util::numberSuffixes[sday%10]:"th",syear); return out; }