summaryrefslogtreecommitdiff
path: root/utils/tfstats/whokilledwho.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utils/tfstats/whokilledwho.cpp')
-rw-r--r--utils/tfstats/whokilledwho.cpp234
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