Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

304 lines
7.5 KiB

5 years ago
//========= 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 <stdarg.h>
#include <string.h>
#include <vector>
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<string,string> 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;i<NUM_CLASSES;i++)
{
if (stricmp(plrClass,plrClassNames[i])==0)
return (player_class)i;
}
return PC_UNDEFINED;
}
//------------------------------------------------------------------------------------------------------
// Function: Util::time_t2hours
// Purpose: returns how many hours are in the given time
// Input: tmr - the time to convert
// Output: int
//------------------------------------------------------------------------------------------------------
int Util::time_t2hours(time_t tmr)
{
tm* pstart=gmtime(&tmr);
if (!pstart)
return 0;
return pstart->tm_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;
}