You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
227 lines
4.8 KiB
227 lines
4.8 KiB
//========= 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;i<MAX_TEAMS;i++) |
|
{ |
|
teams[team].allies[i]= (i==team); //initially set team to be allied with itself. |
|
} |
|
//get allies |
|
i=5; |
|
CLogEventArgument const * pArg=(*it)->getArgument(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;i<MAX_TEAMS;i++) |
|
{ |
|
if (teams[i].valid && teams[i].fWinner) |
|
{ |
|
if (!firstWinner) |
|
strcat(winnerString," and "); |
|
strcat(winnerString,g_pMatchInfo->teamName(i).c_str()); |
|
firstWinner=false; |
|
} |
|
} |
|
return winnerString; |
|
} |
|
|
|
int CMatchResults::getWinnerTeamScore() |
|
{ |
|
if (draw) |
|
return teams[0].score; |
|
|
|
for (int i=0;i<MAX_TEAMS;i++) |
|
if (teams[i].valid && teams[i].fWinner) |
|
return teams[i].score; |
|
return 0; |
|
} |
|
|
|
void CMatchResults::calcRealWinners() |
|
{ |
|
//first find the highest score. |
|
int maxScoreTeam=0; |
|
for (int i=0;i<MAX_TEAMS;i++) |
|
{ |
|
teams[i].fWinner=false; |
|
if (teams[i].score > 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;j<MAX_TEAMS;j++) |
|
{ |
|
if (teams[maxScoreTeam].allies[j]) |
|
teams[j].fWinner=true; |
|
} |
|
} |
|
|
|
char* CMatchResults::getLoserTeamsString() |
|
{ |
|
bool firstLoser=true; |
|
|
|
|
|
for (int i=0;i<MAX_TEAMS;i++) |
|
{ |
|
if (teams[i].valid && !teams[i].fWinner) |
|
{ |
|
if (!firstLoser) |
|
strcat(loserString," and "); |
|
strcat(loserString,g_pMatchInfo->teamName(i).c_str()); |
|
firstLoser=false; |
|
} |
|
} |
|
return loserString; |
|
} |
|
|
|
int CMatchResults::getLoserTeamScore() |
|
{ |
|
if (draw) |
|
return teams[0].score; |
|
for (int i=0;i<MAX_TEAMS;i++) |
|
if (teams[i].valid && !teams[i].fWinner) |
|
return teams[i].score; |
|
return 0; |
|
} |
|
|
|
bool CMatchResults::Outnumbered(int WinnerOrLoser) |
|
{ |
|
int losers=0; |
|
int winners=0; |
|
for (int i=0;i<MAX_TEAMS;i++) |
|
{ |
|
if (teams[i].fWinner) |
|
winners+=teams[i].numplayers; |
|
else |
|
losers+=teams[i].numplayers; |
|
} |
|
|
|
if (WinnerOrLoser == WINNER) |
|
return losers > winners; |
|
else |
|
return losers < winners; |
|
} |
|
|
|
int CMatchResults::numWinningTeams() |
|
{ |
|
int num=0; |
|
for (int i=0;i<MAX_TEAMS;i++) |
|
{ |
|
if (teams[i].fWinner) num++; |
|
} |
|
return num; |
|
} |
|
void CMatchResults::writeHTML(CHTMLFile& html) |
|
{ |
|
calcRealWinners(); //deal with logging bug in DLL |
|
html.write("<div class=headline>\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! <br> All teams scored %li \n",getWinnerTeamScore()); |
|
|
|
|
|
html.write("</div>"); |
|
|
|
} |
|
|
|
|