bool COSCStatsSender::SendPlayerStats() { static const CPlayer* localPlayer = playerHandler->Player(gu->myPlayerNum); static const char* localPlayerName = localPlayer->name.c_str(); if (IsEnabled()) { // get the latest player stats const CPlayer::Statistics& playerStats = localPlayer->currentStats; (*oscPacker) << osc::BeginBundleImmediate << osc::BeginMessage(OSC_MSG_TOPIC_PLAYER_VALUES) << (const char*) localPlayerName << (float) (playerStats.mouseClicks*60/game->totalGameTime) << (float) (playerStats.mousePixels*60/game->totalGameTime) << (float) (playerStats.keyPresses*60/game->totalGameTime) << (float) (playerStats.numCommands*60/game->totalGameTime) << (float) ((playerStats.numCommands != 0) ? ((float) playerStats.unitCommands / playerStats.numCommands) : 0.0) << osc::EndMessage << osc::EndBundle; return SendOscBuffer(); } else { return false; } }
bool COSCStatsSender::SendPropertiesInfo(const char* oscAdress, const char* fmt, void* params[]) { if (IsEnabled() && (oscAdress != NULL) && (fmt != NULL)) { (*oscPacker) << osc::BeginBundleImmediate << osc::BeginMessage(oscAdress); int param_size = strlen(fmt); for (int i=0; i < param_size; ++i) { const char type = fmt[i]; const void* param_p = params[i]; switch (type) { case 'i': { (*oscPacker) << *((const int*) param_p); } case 'f': { (*oscPacker) << *((const float*) param_p); } case 's': { (*oscPacker) << *((const char**) param_p); } case 'b': { (*oscPacker) << *((const unsigned char**) param_p); } default: { throw "Illegal OSC type used, has to be one of: i, f, s, b"; } } } (*oscPacker) << osc::EndMessage << osc::EndBundle; return SendOscBuffer(); } else { return false; } }
bool COSCStatsSender::SendTeamStatsTitles() { if (IsEnabled()) { (*oscPacker) << osc::BeginBundleImmediate << osc::BeginMessage(OSC_MSG_TOPIC_TEAM_TITLES) << "Team number" << "Metal used" << "Energy used" << "Metal produced" << "Energy produced" << "Metal excess" << "Energy excess" << "Metal received" << "Energy received" << "Metal sent" << "Energy sent" << "Metal stored" << "Energy stored" << "Active Units" << "Units killed" << "Units produced" << "Units died" << "Units received" << "Units sent" << "Units captured" << "Units stolen" << "Damage Dealt" << "Damage Received" << osc::EndMessage << osc::EndBundle; return SendOscBuffer(); } else { return false; } }
bool COSCStatsSender::SendPlayerStatsTitles() { if (IsEnabled()) { (*oscPacker) << osc::BeginBundleImmediate << osc::BeginMessage(OSC_MSG_TOPIC_PLAYER_TITLES) << "Player Name" << "Mouse clicks per minute" << "Mouse movement in pixels per minute" << "Keyboard presses per minute" << "Unit commands per minute" << "Average command size (units affected per command)" << osc::EndMessage << osc::EndBundle; return SendOscBuffer(); } else { return false; } }
bool COSCStatsSender::SendInitialInfo() { if (IsEnabled()) { (*oscPacker) << osc::BeginBundleImmediate << osc::BeginMessage(OSC_MSG_TOPIC_INIT_TITLES) << "Engine name" << "Engine version" << "Number of teams" << osc::EndMessage << osc::BeginMessage(OSC_MSG_TOPIC_INIT_VALUES) << "spring" << SpringVersion::GetFull().c_str() << teamHandler->ActiveTeams() << osc::EndMessage << osc::EndBundle; return SendOscBuffer(); } else { return false; } }
bool COSCStatsSender::SendTeamStats() { static const int teamId = gu->myTeam; static unsigned int prevHistSize = 0; if (IsEnabled()) { std::list<CTeam::Statistics> statHistory = teamHandler->Team(teamId)->statHistory; unsigned int currHistSize = statHistory.size(); // only send if we did not yet send the latest history stats if (currHistSize <= prevHistSize) { return false; } // get the latest history stats std::list<CTeam::Statistics>::const_iterator latestStats_p = --(statHistory.end()); const CTeam::Statistics& teamStats = *latestStats_p; (*oscPacker) << osc::BeginBundleImmediate << osc::BeginMessage(OSC_MSG_TOPIC_TEAM_VALUES) << (int) teamId << (float) teamStats.metalUsed << (float) teamStats.energyUsed << (float) teamStats.metalProduced << (float) teamStats.energyProduced << (float) teamStats.metalExcess << (float) teamStats.energyExcess << (float) teamStats.metalReceived << (float) teamStats.energyReceived << (float) teamStats.metalSent << (float) teamStats.energySent << (float) (teamStats.metalProduced+teamStats.metalReceived - (teamStats.metalUsed+teamStats.metalSent+teamStats.metalExcess)) << (float) (teamStats.energyProduced+teamStats.energyReceived - (teamStats.energyUsed+teamStats.energySent+teamStats.energyExcess)) << (int) (teamStats.unitsProduced+teamStats.unitsReceived+teamStats.unitsCaptured - (teamStats.unitsDied+teamStats.unitsSent+teamStats.unitsOutCaptured)) << (int) teamStats.unitsKilled << (int) teamStats.unitsProduced << (int) teamStats.unitsDied << (int) teamStats.unitsReceived << (int) teamStats.unitsSent << (int) teamStats.unitsCaptured << (int) teamStats.unitsOutCaptured << (float) teamStats.damageDealt << (float) teamStats.damageReceived << osc::EndMessage << osc::EndBundle; prevHistSize = currHistSize; return SendOscBuffer(); } else { return false; } }