Commit part 3 of patch #901, score submission is now ported over to the new API.

git-svn-id: svn+ssh://svn.gna.org/svn/warzone/trunk@3220 4a71c877-e1ca-e34f-864e-861f7616d084
master
Freddie Witherden 2007-12-29 12:18:40 +00:00
parent c2c5fdb3dc
commit 62d372c471
3 changed files with 69 additions and 61 deletions

View File

@ -700,7 +700,7 @@ BOOL recvMessage(void)
recvGift(&msg); recvGift(&msg);
break; break;
case NET_SCORESUBMIT: // a score update from another player case NET_SCORESUBMIT: // a score update from another player
recvScoreSubmission(&msg); recvScoreSubmission();
break; break;
case NET_VTOL: case NET_VTOL:
recvHappyVtol(&msg); recvHappyVtol(&msg);

View File

@ -58,7 +58,7 @@ extern BOOL sendWholeDroid (DROID *pD, UDWORD dest);
//extern BOOL sendWholeStructure (STRUCTURE *pS, DPID dest); //extern BOOL sendWholeStructure (STRUCTURE *pS, DPID dest);
extern void recvOptions (NETMSG *pMsg); extern void recvOptions (NETMSG *pMsg);
extern void sendOptions (UDWORD dest, UDWORD play); extern void sendOptions (UDWORD dest, UDWORD play);
extern BOOL recvScoreSubmission (NETMSG *pMsg); extern BOOL recvScoreSubmission ();
extern BOOL recvDestroyExtra (NETMSG *pMsg); extern BOOL recvDestroyExtra (NETMSG *pMsg);
extern BOOL recvAudioMsg (NETMSG *pMsg); extern BOOL recvAudioMsg (NETMSG *pMsg);
extern BOOL recvHappyVtol (NETMSG *pMsg); extern BOOL recvHappyVtol (NETMSG *pMsg);

View File

@ -950,104 +950,112 @@ BOOL recvPowerCheck()
BOOL sendScoreCheck(void) BOOL sendScoreCheck(void)
{ {
static UDWORD lastsent = 0; static UDWORD lastsent = 0;
UDWORD i; uint8_t i;
BOOL isData = FALSE;
PLAYERSTATS stats; PLAYERSTATS stats;
NETMSG m;
if(lastsent > gameTime)lastsent= 0; if (lastsent > gameTime)
if((gameTime-lastsent) < SCORE_FREQUENCY ) // only send if not done recently. {
lastsent= 0;
}
if (gameTime - lastsent < SCORE_FREQUENCY)
{ {
return TRUE; return TRUE;
} }
lastsent = gameTime; lastsent = gameTime;
// syncronise scores. // Update local score
stats = getMultiStats(selectedPlayer, TRUE);
// update local score // Add recently scored points
stats = getMultiStats(selectedPlayer,TRUE); stats.recentKills += stats.killsToAdd;
stats.recentKills += stats.killsToAdd; // add recently scored points.
stats.totalKills += stats.killsToAdd; stats.totalKills += stats.killsToAdd;
stats.recentScore += stats.scoreToAdd; stats.recentScore += stats.scoreToAdd;
stats.totalScore += stats.scoreToAdd; stats.totalScore += stats.scoreToAdd;
stats.killsToAdd =0;
stats.scoreToAdd =0; // Zero them now added
stats.killsToAdd = stats.scoreToAdd = 0;
setMultiStats(player2dpid[selectedPlayer],stats,TRUE); // store local version. // Store local version
setMultiStats(player2dpid[selectedPlayer],stats,FALSE); // send score to the ether setMultiStats(player2dpid[selectedPlayer], stats, TRUE);
// Send score to the ether
setMultiStats(player2dpid[selectedPlayer], stats, FALSE);
// broadcast any changes in other players, but not in FRONTEND!!! // Broadcast any changes in other players, but not in FRONTEND!!!
if(titleMode != MULTIOPTION && titleMode != MULTILIMIT) if (titleMode != MULTIOPTION && titleMode != MULTILIMIT)
{ {
m.size =0; NETbeginEncode(NET_SCORESUBMIT, NET_ALL_PLAYERS);
for(i = 0; i<MAX_PLAYERS; i++)
for (i = 0; i < MAX_PLAYERS; i++)
{ {
if(isHumanPlayer(i) && (i!=selectedPlayer)) if (isHumanPlayer(i) && i != selectedPlayer)
{ {
stats=getMultiStats(i,TRUE); stats = getMultiStats(i, TRUE);
if(stats.killsToAdd || stats.scoreToAdd )
if (stats.killsToAdd || stats.scoreToAdd )
{ {
m.body[m.size] = (UBYTE)i; NETuint8_t(&i);
m.size += 1;
NetAdd(m,m.size,stats.killsToAdd); NETuint32_t(&stats.killsToAdd);
m.size += sizeof(stats.killsToAdd); NETuint32_t(&stats.scoreToAdd);
NetAdd(m,m.size,stats.scoreToAdd);
m.size += sizeof(stats.scoreToAdd); isData = TRUE;
} }
} }
} }
if(m.size != 0)
// If we added any data to the packet
if (isData)
{ {
m.body[m.size] = ANYPLAYER; // terminate msg. // Terminate the message with ANYPLAYER
m.size += 1; uint8_t player = ANYPLAYER;
m.type = NET_SCORESUBMIT; NETuint8_t(&player);
NETbcast(&m,FALSE);
// Send the message
NETend();
} }
} }
// get global versions of scores. // Get global versions of scores
for(i = 0; i<MAX_PLAYERS; i++) for (i = 0; i < MAX_PLAYERS; i++)
{ {
if(isHumanPlayer(i) ) if (isHumanPlayer(i))
{ {
setMultiStats(player2dpid[i], getMultiStats(i,FALSE) ,TRUE); setMultiStats(player2dpid[i], getMultiStats(i, FALSE), TRUE);
} }
} }
return TRUE; return TRUE;
} }
BOOL recvScoreSubmission(NETMSG *pMsg) BOOL recvScoreSubmission()
{ {
UDWORD player=0,kil,index; uint8_t player;
SDWORD sco; uint32_t kills, score;
PLAYERSTATS stats; PLAYERSTATS stats;
// process msg, add to next score addition. NETbeginDecode();
index = 0;
while(player != ANYPLAYER) for (NETuint8_t(&player); player != ANYPLAYER; NETuint8_t(&player))
{ {
player = pMsg->body[index]; if (player == selectedPlayer)
index+=1;
if(player != ANYPLAYER)
{ {
NetGet(pMsg,index,kil); NETuint32_t(&kills);
index+=sizeof(kil); NETuint32_t(&score);
NetGet(pMsg,index,sco);
index+=sizeof(sco); stats = getMultiStats(player, TRUE);
stats.killsToAdd += kills;
// do the update. stats.scoreToAdd += score;
if(player == selectedPlayer)
{ break;
stats = getMultiStats(player,TRUE);
stats.killsToAdd += kil;
stats.scoreToAdd += sco;
setMultiStats(player2dpid[player],stats,TRUE); // store local version.
}
} }
} }
return TRUE; return TRUE;
} }