//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: Implementation of CDialogueReadout // // $Workfile: $ // $Date: $ // //------------------------------------------------------------------------------------------------------ // $Log: $ // // $NoKeywords: $ //=============================================================================// #include "DialogueReadout.h" #include "util.h" //------------------------------------------------------------------------------------------------------ // Function: CDialogueReadout::writeHTML // Purpose: generates and writes the report. generate() is not used in this object // because there is no real intermediate data. Really data is just taken from the // event list, massaged abit, and written out to the html file. There is no calculation // of stats or figures so no intermedidate data creation is needed. // Input: html - the html file that we want to write to. //------------------------------------------------------------------------------------------------------ void CDialogueReadout::writeHTML(CHTMLFile& html) { html.write("\n",g_pApp->supportHTTPPath.c_str()); html.div("dialog"); CEventListIterator it; bool MM2Messages=false; if (g_pApp->cmdLineSwitches["displaymm2"]=="on" || g_pApp->cmdLineSwitches["displaymm2"]=="yes" || g_pApp->cmdLineSwitches["displaymm2"]=="true" || g_pApp->cmdLineSwitches["displaymm2"]=="1") MM2Messages=true; for (it=g_pMatchInfo->eventList()->begin(); it != g_pMatchInfo->eventList()->end(); ++it) { if ((*it)->getType()==CLogEvent::SAY || (MM2Messages && ((*it)->getType()==CLogEvent::SAY_TEAM))) { char talked[512]={0}; PID talkerPID=(*it)->getArgument(0)->asPlayerGetPID(); string talkerName=(*it)->getArgument(0)->asPlayerGetName(); for (int i=1;(*it)->getArgument(i);i++) { char temp[512]; (*it)->getArgument(i)->getStringValue(temp); strcat(talked,"\""); strcat(talked,temp); strcat(talked,"\""); } bool isTeamMsg= (*it)->getType()==CLogEvent::SAY_TEAM; int teamID=g_pMatchInfo->playerList()[talkerPID].teams.atTime((*it)->getTime()); const char* aa; const char* bb; if (teamID<4 && teamID >= 0) { aa="player"; bb=Util::teamcolormap[teamID]; } else { aa="whitetext"; bb=""; } html.write("%s%s: %s\n",aa,bb,talkerName.c_str(),isTeamMsg?" (Team)":"",talked); html.br(); } else if ( (*it)->getType()==CLogEvent::KILLED_BY_WORLD) { PID plr=(*it)->getArgument(0)->asPlayerGetPID(); string plrName=(*it)->getArgument(0)->asPlayerGetName(); int teamID=g_pMatchInfo->playerList()[plr].teams.atTime((*it)->getTime()); html.write("%s died.\n",Util::teamcolormap[teamID],plrName.c_str()); html.br(); } else if ((*it)->getType()==CLogEvent::SUICIDE) { PID plr=(*it)->getArgument(0)->asPlayerGetPID(); string plrName=(*it)->getArgument(0)->asPlayerGetName(); int teamID=g_pMatchInfo->playerList()[plr].teams.atTime((*it)->getTime()); html.write("%s committed suicide.\n",Util::teamcolormap[teamID],plrName.c_str()); html.br(); } else if ((*it)->getType()==CLogEvent::TEAM_JOIN) { PID plr=(*it)->getArgument(0)->asPlayerGetPID(); string plrName=(*it)->getArgument(0)->asPlayerGetName(); time_t eventtime=(*it)->getTime(); bool firstJoin=!g_pMatchInfo->playerList()[plr].teams.anythingAtTime(eventtime-1); int oldTeamID=g_pMatchInfo->playerList()[plr].teams.atTime(eventtime-1); int teamID=g_pMatchInfo->playerList()[plr].teams.atTime(eventtime); string teamName=g_pMatchInfo->teamName(teamID); if (firstJoin) html.write("%s joined team %s.\n",Util::teamcolormap[teamID],plrName.c_str(),Util::teamcolormap[teamID],teamName.c_str()); else html.write("%s changed teams to %s.\n",Util::teamcolormap[oldTeamID],plrName.c_str(),Util::teamcolormap[teamID],teamName.c_str()); html.br(); } else if ((*it)->getType()==CLogEvent::FRAG) { PID killer=(*it)->getArgument(0)->asPlayerGetPID(); string killerName=(*it)->getArgument(0)->asPlayerGetName(); PID killee=(*it)->getArgument(1)->asPlayerGetPID(); string killeeName=(*it)->getArgument(1)->asPlayerGetName(); string weaponName = (*it)->getArgument(2)->getStringValue(); int killerTeamID=g_pMatchInfo->playerList()[killer].teams.atTime((*it)->getTime()); int killeeTeamID=g_pMatchInfo->playerList()[killee].teams.atTime((*it)->getTime()); bool countKill=true; //gotta account for timer/infection double kills for medics! if (weaponName=="infection") { //test to see if the previous event was a timer from the same player, and a kill, and with the timer. CEventListIterator it2=it; if ((--it2)!=g_pMatchInfo->eventList()->begin()) { if ((*it2)->getType() == CLogEvent::FRAG) if ((*it2)->getArgument(2)->getStringValue()=="timer") if ((*it2)->getArgument(0)->asPlayerGetPID()==killer) countKill=false; } } if (countKill) { html.write("%s killed %s with %s. \n", Util::teamcolormap[killerTeamID],killerName.c_str(),Util::teamcolormap[killeeTeamID],killeeName.c_str(),weaponName.c_str()); html.br(); } } else if ((*it)->getType()==CLogEvent::TEAM_FRAG) { PID killer=(*it)->getArgument(0)->asPlayerGetPID(); string killerName=(*it)->getArgument(0)->asPlayerGetName(); PID killee=(*it)->getArgument(1)->asPlayerGetPID(); string killeeName=(*it)->getArgument(1)->asPlayerGetName(); int killerTeamID=g_pMatchInfo->playerList()[killer].teams.atTime((*it)->getTime()); int killeeTeamID=g_pMatchInfo->playerList()[killee].teams.atTime((*it)->getTime()); html.write("%s teamkilled %s.\n", Util::teamcolormap[killerTeamID],killerName.c_str(),Util::teamcolormap[killeeTeamID],killeeName.c_str()); html.br(); } } html.enddiv(); }