//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: Implementation of CPlayerReport; // // $Workfile: $ // $Date: $ // //------------------------------------------------------------------------------------------------------ // $Log: $ // // $NoKeywords: $ //=============================================================================// #include "util.h" #include "PlayerReport.h" #include "PlrPersist.h" map CPlayerReport::alreadyPersisted; map CPlayerReport::alreadyWroteCombStats; //------------------------------------------------------------------------------------------------------ // Function: CPlayerReport::writeHTML // Purpose: writes the player's stats out as HTML // Input: html - the html file to which we're writing //------------------------------------------------------------------------------------------------------ void CPlayerReport::writeHTML(CHTMLFile& html) { //if we're writing the stats for a persistent player, just pass execution off to that function! if (reportingPersistedPlayer) { writePersistHTML(html); return; } pPlayer->totalTimeOn(); //this ensures that the logoff time is correct if (iWhichTeam==ALL_TEAMS) pPlayer->merge(); else if (!pPlayer->teams.contains(iWhichTeam)) { return; } int tid=iWhichTeam; if (tid==ALL_TEAMS) html.write("%s
\n",pPlayer->name.c_str()); else html.write("%s
\n",Util::teamcolormap[tid],pPlayer->name.c_str()); if (pPlayer->aliases.size() > 1) { map namePrinted; namePrinted[pPlayer->name.c_str()]=true; html.write("aliases: "); CTimeIndexedList::iterator nmiter=pPlayer->aliases.begin(); bool printed1=false; for (nmiter;nmiter!=pPlayer->aliases.end();++nmiter) { if (namePrinted[nmiter->data]!=true) { if (printed1) html.write(", "); html.write(nmiter->data.c_str()); namePrinted[nmiter->data]=true; printed1=true; } } html.write("
\n"); } html.write("rank: %.2lf
\n",pPlayer->perteam[tid].rank()); html.write("kills/deaths: %li/%li
\n",pPlayer->perteam[tid].kills,pPlayer->perteam[tid].deaths); html.write("time: %01li:%02li:%02li
\n",Util::time_t2hours(pPlayer->perteam[tid].timeOn()),Util::time_t2mins(pPlayer->perteam[tid].timeOn()),Util::time_t2secs(pPlayer->perteam[tid].timeOn())); int numClassesPlayed=pPlayer->perteam[tid].classesplayed.numDifferent(); player_class faveClass=pPlayer->perteam[tid].classesplayed.favourite(); if (numClassesPlayed == 1) { if (faveClass!=PC_UNDEFINED) html.write("class: %s
\n",plrClassNames[faveClass]); } else if (numClassesPlayed > 1) { if (faveClass!=PC_UNDEFINED) html.write("favorite class: %s
\n",plrClassNames[faveClass]); html.write("classes played: "); bool printedone=false; for(int pc=PC_SCOUT;pc!=PC_OBSERVER;++pc) { if (pPlayer->perteam[tid].classesplayed.contains((player_class)pc)) { if (printedone) html.write(", "); html.write(plrClassNames[pc]); printedone=true; } } html.write("
\n"); } const string weap=pPlayer->perteam[tid].faveWeapon(); const string faveWeap=Util::getFriendlyWeaponName(weap); if (pPlayer->perteam[tid].kills!=0) { char lowerWeapName[50]; Util::str2lowercase(lowerWeapName,faveWeap.c_str()); html.write("favorite weapon: %s
\n",faveWeap.c_str()); html.write("kills with %s: %li
\n",lowerWeapName,pPlayer->perteam[tid].faveWeapKills()); } int numTeamsPlayed=pPlayer->teams.numDifferent(); if (numTeamsPlayed > 1) { if (iWhichTeam==ALL_TEAMS) html.write("Played on "); else html.write("Also played on "); map alreadyPrinted; CTimeIndexedList::iterator tmiter=pPlayer->teams.begin(); bool printed1=false; for (tmiter;tmiter!=pPlayer->teams.end();++tmiter) { int team=tmiter->data; if (team != iWhichTeam && !alreadyPrinted[team]) { if (printed1) html.write(" and "); html.write("%s",Util::teamcolormap[team],Util::teamcolormap[team]);// printed1=true; alreadyPrinted[team]=true; } } html.write("
\n"); } if (numTeamsPlayed > 1 && iWhichTeam != ALL_TEAMS) { html.write(" Combined stats for this match
\n",pPlayer->pid); if (!alreadyWroteCombStats[pPlayer->pid]) { CPlayerReport cpr(pPlayer,ALL_TEAMS); char numbuf[200]; char namebuf[200]; sprintf(numbuf,"%lu.html",pPlayer->pid); sprintf(namebuf,"Combined match statistics for %s",pPlayer->name.c_str()); cpr.makeHTMLPage(numbuf,namebuf); alreadyWroteCombStats[pPlayer->pid]=true; } } if (g_pApp->cmdLineSwitches["persistplayerstats"]=="yes" && !g_pMatchInfo->isLanGame()) html.write(" Combined stats on this server
\n",g_pApp->playerHTTPPath.c_str(),pPlayer->WONID,pPlayer->name.c_str()); if (g_pMatchInfo->isLanGame()) return; if (alreadyPersisted[pPlayer->WONID] || reportingPersistedPlayer) return; alreadyPersisted[pPlayer->WONID]=true; if (g_pApp->cmdLineSwitches["persistplayerstats"]=="yes") { CPlrPersist cpp; CPlrPersist onDisk; cpp.generate(*pPlayer); onDisk.read(pPlayer->WONID); cpp.merge(onDisk); cpp.write(); } } //------------------------------------------------------------------------------------------------------ // Function: CPlayerReport::writePersistHTML // Purpose: writes a persistent player's stats out. these look slightly different // than normal players stats // Input: html - the html file to write the html to //------------------------------------------------------------------------------------------------------ void CPlayerReport::writePersistHTML(CHTMLFile& html) { html.write("\n",pPersist->WONID); html.write("%s
\n",pPersist->faveName().c_str()); map namePrinted; namePrinted[pPersist->faveName()]=true; map::iterator nmiter=pPersist->nickmap.begin(); bool printed1=false; for (nmiter;nmiter!=pPersist->nickmap.end();++nmiter) { if (namePrinted[nmiter->first]!=true) { if (!printed1) html.write("other names used: "); if (printed1) html.write(", "); html.write(nmiter->first.c_str()); namePrinted[nmiter->first]=true; printed1=true; } } if (printed1) html.write("
\n"); html.write("rank: %.2lf
\n",pPersist->rank()); html.write("kills/deaths: %li/%li
\n",pPersist->kills,pPersist->deaths); html.write("time: %01li:%02li:%02li
\n",Util::time_t2hours(pPersist->timeon),Util::time_t2mins(pPersist->timeon),Util::time_t2secs(pPersist->timeon)); html.write("matches played: %li
\n",pPersist->matches); string faveClass=pPersist->faveClass(); if (faveClass!="Undefined") html.write("favorite class: %s
\n",faveClass.c_str()); bool printedone=false; map::iterator classit=pPersist->classmap.begin(); map classPrinted; classPrinted[pPersist->faveClass()]=true; for(classit;classit!=pPersist->classmap.end();++classit) { if (classPrinted[classit->first]==false) { if (!printedone) html.write("other classes played: "); if (printedone) html.write(", "); html.write(classit->first.c_str()); classPrinted[classit->first]=true; printedone=true; } } if (printedone) html.write("
\n"); const string weap=pPersist->faveWeap(); const string faveWeap=Util::getFriendlyWeaponName(weap); if (pPersist->kills!=0) { char lowerWeapName[50]; Util::str2lowercase(lowerWeapName,faveWeap.c_str()); html.write("favorite weapon: %s
\n",faveWeap.c_str()); html.write("kills with %s: %li
\n",lowerWeapName,pPersist->faveweapkills); } }