diff options
Diffstat (limited to 'utils/tfstats/whokilledwho.cpp')
| -rw-r--r-- | utils/tfstats/whokilledwho.cpp | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/utils/tfstats/whokilledwho.cpp b/utils/tfstats/whokilledwho.cpp new file mode 100644 index 0000000..665c6b9 --- /dev/null +++ b/utils/tfstats/whokilledwho.cpp @@ -0,0 +1,234 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Implementation of CWhoKilledWho +// +// $Workfile: $ +// $Date: $ +// +//------------------------------------------------------------------------------------------------------ +// $Log: $ +// +// $NoKeywords: $ +//=============================================================================// +#include "WhoKilledWho.h" + +//------------------------------------------------------------------------------------------------------ +// Function: CWhoKilledWho::init +// Purpose: initializes the object +//------------------------------------------------------------------------------------------------------ +void CWhoKilledWho::init() +{ + nextbid=0; + if (kills) delete [] kills; + if (deaths) delete [] deaths; + deaths=kills=NULL; +} + + +void CWhoKilledWho::makeBidMap() +{ + int nextbid=0; + for (int t=0;t<MAX_TEAMS;t++) + { + CPlayerListIterator it=g_pMatchInfo->playerBegin(); + for (it;it!=g_pMatchInfo->playerEnd();++it) + { + const PID& pid=(*it).first; + CPlayer& p=(*it).second; + + if (!p.teams.contains(t)) + continue; + + pair<int,PID> pr(t,pid); + + bidMap[pr]=nextbid; + bidMap2[nextbid]=pr; + nextbid++; + } + } + size=nextbid; +} + + +//------------------------------------------------------------------------------------------------------ +// Function: CWhoKilledWho::generate +// Purpose: generates intermediate data from the match info +//------------------------------------------------------------------------------------------------------ +void CWhoKilledWho::generate() +{ + init(); + + + makeBidMap(); + + if (size==0) + return; + + kills=new int[size*size]; + memset(kills,0,sizeof(int)*size*size); + + deaths=new int[size]; + memset(deaths,0,sizeof(int)*size); + //now the pids table is all full of pids and you index it using Board IDs (bids) + //also there is a bids table so you know which pid each board entry has. + + CEventListIterator it; + for (it=g_pMatchInfo->eventList()->begin(); it != g_pMatchInfo->eventList()->end(); ++it) + { + if ((*it)->getType()==CLogEvent::SUICIDE || (*it)->getType()==CLogEvent::KILLED_BY_WORLD) + { + + PID plr=(*it)->getArgument(0)->asPlayerGetPID(); + int plrTeam=g_pMatchInfo->playerList()[plr].teams.atTime((*it)->getTime()); + + pair<int,PID> plrpr(plrTeam,plr); + + int plrbid=bidMap[plrpr]; + kills[plrbid*size+plrbid]++; + + deaths[plrbid]++; + + } + else if ((*it)->getType()==CLogEvent::FRAG || (*it)->getType()==CLogEvent::TEAM_FRAG) + { + PID killer=(*it)->getArgument(0)->asPlayerGetPID(); + PID killee=(*it)->getArgument(1)->asPlayerGetPID(); + + int killerTeam=g_pMatchInfo->playerList()[killer].teams.atTime((*it)->getTime()); + int killeeTeam=g_pMatchInfo->playerList()[killee].teams.atTime((*it)->getTime()); + + pair<int,PID> killerpr(killerTeam,killer); + pair<int,PID> killeepr(killeeTeam,killee); + + int killerbid=bidMap[killerpr]; + int killeebid=bidMap[killeepr]; + + kills[killerbid*size+killeebid]++; + deaths[killeebid]++; + } + } +} + +//------------------------------------------------------------------------------------------------------ +// Function: CWhoKilledWho::getCellClass +// Purpose: Helper function that returns the class of a cell on the board depending +// on where it occurs in the board. +// Input: u - the x position of the cell +// v - the y position of the cell +// Output: const char* +//------------------------------------------------------------------------------------------------------ +const char* CWhoKilledWho::getCellClass(int u,int v) +{ + char* tdclass; + if (u == v+1) + tdclass="class=boardcell_br"; + else if (u>v) + tdclass="class=boardcell_r"; + if (u == v-1) + tdclass="class=boardcell_br"; + else if (u<v) + tdclass="class=boardcell_b"; + else if (u == v) + tdclass="class=boardcell_br"; + + return tdclass; +} + +//------------------------------------------------------------------------------------------------------ +// Function: CWhoKilledWho::writeHTML +// Purpose: takes the intermediate data generated by generate() and writes out +// HTML to the specified HTML file object +// Input: html - the object to write the output to +//------------------------------------------------------------------------------------------------------ +void CWhoKilledWho::writeHTML(CHTMLFile& html) +{ + if (size==0) + return; + + int numcols=size+2; + int numrows=size+4; + int i=0,j=0; + + int playerNameWid=120; + int cellWid=20; + int lastColWid=30; + int tableWid=playerNameWid+size*cellWid+lastColWid; + + html.write("<img src=\"%s/detailed.gif\">",g_pApp->supportHTTPPath.c_str()); + + string jshttppath(g_pApp->supportHTTPPath); + jshttppath+="/support.js"; + + html.write("<script language=\"JavaScript\" src=\"%s\"></script>\n",jshttppath.c_str()); + html.write("<script language=\"JavaScript\">\n<!--\nthisBrowser = new BrowserType();\nthisBrowser.VerifyIE5()//-->\n</script>\n"); + + html.write("<script language=\"JavaScript\"> thisBrowser.writeDetailTableTag(%li,%li,%li); </script>\n",tableWid,numrows,numcols); + + + //print columns + html.write("<tr class=header align=center> <td width=%li align =left><font class=boardtext>Player</font></td>\n",playerNameWid); + for (i=0;i<size;i++) + { + //int tid= g_pMatchInfo->playerTeamID(pids[i]); + //int tid=3; + int tid=bidMap2[i].first; + html.write("<td width=%li><font class=player%s>%2d</font></th>\n",cellWid,Util::teamcolormap[tid],i); + } + html.write("<td align=left width=%li><font class=boardtext>Kills</font></th>\n",lastColWid); + html.write("</tr>\n"); + + + int totalkills=0; + int killerbid; + for (killerbid=0;killerbid<size;++killerbid) + { + int tot=0; + char truncatedPlayerName[21]; + strncpy(truncatedPlayerName, g_pMatchInfo->playerName(bidMap2[killerbid].second).c_str(),20); + truncatedPlayerName[20]=0; + //int tid=g_pMatchInfo->playerTeamID(pids[killerbid]); + int tid=bidMap2[killerbid].first; + html.write("<tr><td class=boardcell_b align=left width=%li><font class=player%s><nobr>%d. %s</nobr></font></th>\n",playerNameWid,Util::teamcolormap[tid], killerbid,truncatedPlayerName); + + int killeebid; + for (killeebid=0;killeebid<size;++killeebid) + { + const char* tdclass=getCellClass(killeebid,killerbid); + html.write("<td align=center width=%li %s><font class=boardtext>%i</font></td>\n",cellWid,tdclass,kills[killerbid*size+killeebid]); + + if (killeebid != killerbid) + tot+=kills[killerbid*size+killeebid]; + else + tot-=kills[killerbid*size+killeebid]; + } + + totalkills+=tot; + html.write("<td align=center width=%li><font class=boardtext>%i</font></td>\n",lastColWid,tot); + html.write("</tr>\n"); + } + + html.write("<tr align=left> <td><font class=boardtext>Deaths</font></th>\n"); + + int totaldeaths=0; + for (i=0;i<size;i++) + { + html.write("<td align=center><font class=boardtext>%i</font></td>\n",deaths[i]); + totaldeaths+=deaths[i]; + } + + //html.write("<td align=left ><font class=boardtext>%3i\\%3i</font></td>\n",totaldeaths,totalkills); + html.write("<td></td>\n"); + html.write("</tr>\n"); + html.write("</table>\n"); + +} + +//------------------------------------------------------------------------------------------------------ +// Function: CWhoKilledWho::~CWhoKilledWho +// Purpose: destructor +//------------------------------------------------------------------------------------------------------ +CWhoKilledWho::~CWhoKilledWho() +{ + if (kills) delete [] kills; + if (deaths) delete [] deaths; +}
\ No newline at end of file |