//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ // //=============================================================================// #include "MatchResults.h" void CMatchResults::init() { memset(teams,0,sizeof(team)*MAX_TEAMS); memset(loserString,0,STRLEN); memset(winnerString,0,STRLEN); valid=false; draw=false; numTeams=0; } void CMatchResults::generate() { CEventListIterator it=g_pMatchInfo->eventList()->end(); --it; for (it=g_pMatchInfo->eventList()->begin();it!=g_pMatchInfo->eventList()->end();++it) { if ((*it)->getType()==CLogEvent::MATCH_RESULTS_MARKER) valid=true; else if ((*it)->getType()==CLogEvent::MATCH_DRAW) { draw=true; } else if ((*it)->getType()==CLogEvent::MATCH_VICTOR) { //winning teams are recited first, then losing teams. so start in "winning" mode bool fWinMode=true; char eventText[200]; strcpy(eventText,(*it)->getFullMessage()); char seps[] = " \n\t"; char *token; token = strtok( eventText, seps ); while( token != NULL ) { if (stricmp(token,"defeated")==0) fWinMode=false; else if (token[0]=='\"') { //found a team name //depending on win/lose mode, assign that team appropriately token++; //advance past the first quote char* quote2=strchr(token,'\"'); *quote2='\0'; //null out the second quote; //get team ID int tID=g_pMatchInfo->teamID(token); teams[tID].fWinner=fWinMode; } //Get next token token = strtok( NULL, seps ); } } else if ((*it)->getType()==CLogEvent::MATCH_TEAM_RESULTS) { int team=g_pMatchInfo->teamID((*it)->getArgument(0)->getStringValue()); teams[team].valid=true; teams[team].numplayers=(*it)->getArgument(1)->getFloatValue(); teams[team].frags=(*it)->getArgument(2)->getFloatValue(); teams[team].unacc_frags=(*it)->getArgument(3)->getFloatValue(); teams[team].score=(*it)->getArgument(4)->getFloatValue(); for (int i=0;igetArgument(i++); while(pArg) { int ally=pArg->getFloatValue()-1; teams[team].allies[ally]=true; teams[ally].allies[team]=true; //one sided alliances don't exist. pArg=(*it)->getArgument(i++); } } } } char* CMatchResults::getWinnerTeamsString() { bool firstWinner=true; for (int i=0;iteamName(i).c_str()); firstWinner=false; } } return winnerString; } int CMatchResults::getWinnerTeamScore() { if (draw) return teams[0].score; for (int i=0;i teams[maxScoreTeam].score) maxScoreTeam=i; } //mark that team as a winner, then mark all their allies as winners teams[maxScoreTeam].fWinner=true; for (int j=0;jteamName(i).c_str()); firstLoser=false; } } return loserString; } int CMatchResults::getLoserTeamScore() { if (draw) return teams[0].score; for (int i=0;i winners; else return losers < winners; } int CMatchResults::numWinningTeams() { int num=0; for (int i=0;i\n"); if (!valid) html.write("No winner has been determined."); else if (!draw) { bool fOutnumbered=false; bool winPlural=numWinningTeams()==1; html.write("%s %s! They scored %li points to %s's %li\n",getWinnerTeamsString(),winPlural?"wins":"win",getWinnerTeamScore(),getLoserTeamsString(),getLoserTeamScore()); } else html.write("The match ends in a draw!
All teams scored %li \n",getWinnerTeamScore()); html.write(""); }