- added first steam achievement support (winning your first game) as a reference

This commit is contained in:
SoftCoder 2017-10-07 14:53:51 -07:00
parent c9da4eb062
commit f744d90538
3 changed files with 107 additions and 100 deletions

View File

@ -5173,64 +5173,77 @@ void Game::DumpCRCWorldLogIfRequired(string fileSuffix) {
}
void saveStatsToSteam(Game* game, Stats& endStats) {
if (NetworkManager::getInstance().isNetworkGame()) {
Steam* steamInstance = CacheManager::getCachedItem<Steam*>(GameConstants::steamCacheInstanceKey);
if (steamInstance != NULL) {
printf("\nSTEAM detected, writing out end game stats for player!\n");
Steam* steamInstance = CacheManager::getCachedItem<Steam*>(GameConstants::steamCacheInstanceKey);
if (steamInstance != NULL) {
printf("\nSTEAM detected, writing out end game stats for player!\n");
if (NetworkManager::getInstance().isNetworkGame()) {
//printf("\nSTEAM Refresh Stats!\n");
steamInstance->requestRefreshStats();
for (int factionIndex = 0;
factionIndex < game->getWorld()->getFactionCount();
++factionIndex) {
factionIndex < game->getWorld()->getFactionCount(); ++factionIndex) {
if (factionIndex == game->getWorld()->getThisFactionIndex()) {
//printf("\nWriting out game stats for Faction Index: %d!\n",factionIndex);
if (endStats.getVictory(factionIndex)) {
steamInstance->setStatAsInt("stat_online_wins",
steamInstance->getStatAsInt("stat_online_wins")
steamInstance->setStatAsInt(EnumParser<SteamStatName>::getString(stat_online_wins).c_str(),
steamInstance->getStatAsInt(EnumParser<SteamStatName>::getString(stat_online_wins).c_str())
+ 1);
} else {
steamInstance->setStatAsInt("stat_online_loses",
steamInstance->getStatAsInt("stat_online_loses")
steamInstance->setStatAsInt(EnumParser<SteamStatName>::getString(stat_online_loses).c_str(),
steamInstance->getStatAsInt(EnumParser<SteamStatName>::getString(stat_online_loses).c_str())
+ 1);
}
steamInstance->setStatAsInt("stat_online_kills",
steamInstance->getStatAsInt("stat_online_kills")
steamInstance->setStatAsInt(EnumParser<SteamStatName>::getString(stat_online_kills).c_str(),
steamInstance->getStatAsInt(EnumParser<SteamStatName>::getString(stat_online_kills).c_str())
+ endStats.getKills(factionIndex));
steamInstance->setStatAsInt("stat_online_kills_enemy",
steamInstance->setStatAsInt(EnumParser<SteamStatName>::getString(stat_online_kills_enemy).c_str(),
steamInstance->getStatAsInt(
"stat_online_kills_enemy")
EnumParser<SteamStatName>::getString(stat_online_kills_enemy).c_str())
+ endStats.getEnemyKills(factionIndex));
steamInstance->setStatAsInt("stat_online_deaths",
steamInstance->getStatAsInt("stat_online_deaths")
steamInstance->setStatAsInt(EnumParser<SteamStatName>::getString(stat_online_deaths).c_str(),
steamInstance->getStatAsInt(EnumParser<SteamStatName>::getString(stat_online_deaths).c_str())
+ endStats.getDeaths(factionIndex));
steamInstance->setStatAsInt("stat_online_units",
steamInstance->getStatAsInt("stat_online_units")
steamInstance->setStatAsInt(EnumParser<SteamStatName>::getString(stat_online_units).c_str(),
steamInstance->getStatAsInt(EnumParser<SteamStatName>::getString(stat_online_units).c_str())
+ endStats.getUnitsProduced(factionIndex));
steamInstance->setStatAsInt(
"stat_online_resources_harvested",
EnumParser<SteamStatName>::getString(stat_online_resources_harvested).c_str(),
steamInstance->getStatAsInt(
"stat_online_resources_harvested")
EnumParser<SteamStatName>::getString(stat_online_resources_harvested).c_str())
+ endStats.getResourcesHarvested(
factionIndex));
if (endStats.getPlayerLeftBeforeEnd(factionIndex)) {
steamInstance->setStatAsInt(
"stat_online_quit_before_end",
EnumParser<SteamStatName>::getString(stat_online_quit_before_end).c_str(),
steamInstance->getStatAsInt(
"stat_online_quit_before_end") + 1);
EnumParser<SteamStatName>::getString(stat_online_quit_before_end).c_str()) + 1);
}
steamInstance->setStatAsDouble("stat_online_minutes_played",
steamInstance->setStatAsDouble(EnumParser<SteamStatName>::getString(stat_online_minutes_played).c_str(),
steamInstance->getStatAsDouble(
"stat_online_minutes_played")
EnumParser<SteamStatName>::getString(stat_online_minutes_played).c_str())
+ getTimeDuationMinutes(
endStats.getFramesToCalculatePlaytime(),
GameConstants::updateFps));
}
}
//printf("\nSTEAM Store Stats!\n");
steamInstance->storeStats();
//printf("\nSTEAM Refresh Stats!\n");
steamInstance->requestRefreshStats();
}
for (int factionIndex = 0;
factionIndex < game->getWorld()->getFactionCount(); ++factionIndex) {
if (factionIndex == game->getWorld()->getThisFactionIndex()) {
printf("\nWriting out game stats for Faction Index: %d won status: %d\n",factionIndex,endStats.getVictory(factionIndex));
if (endStats.getVictory(factionIndex)) {
if(steamInstance->isUnlocked("ACH_WIN_ONE_GAME") == false) {
steamInstance->unlock("ACH_WIN_ONE_GAME");
}
}
}
}
//printf("\nSTEAM Store Stats!\n");
steamInstance->storeStats();
//printf("\nSTEAM Refresh Stats!\n");
steamInstance->requestRefreshStats();
}
}

View File

@ -10,10 +10,10 @@ namespace Glest{ namespace Game{
std::map<std::string,SteamStatType> Steam::SteamStatNameTypes = Steam::create_map();
// Achievements
//static const char *const achievementNames[] = {
// "X",
//};
//#define NUM_ACHIEVEMENTS (sizeof(achievementNames) / sizeof(achievementNames[0]))
static const char *const achievementNames[] = {
"ACH_WIN_ONE_GAME",
};
#define NUM_ACHIEVEMENTS (sizeof(achievementNames) / sizeof(achievementNames[0]))
// Language map
static inline std::map<std::string, std::string> gen_langToCode()
@ -61,7 +61,7 @@ static std::string steamToIsoLang(const char *steamLang) {
// SteamPrivate
struct SteamPrivate {
//std::map<std::string, bool> achievements;
std::map<std::string, bool> achievements;
std::map<std::string, double> stats;
std::string userName;
@ -73,8 +73,20 @@ struct SteamPrivate {
STEAMSHIM_getPersonaName();
STEAMSHIM_getCurrentGameLanguage();
STEAMSHIM_requestStats();
// for (size_t i = 0; i < NUM_ACHIEVEMENTS; ++i)
// STEAMSHIM_getAchievement(achievementNames[i]);
STEAMSHIM_EventType statsReceived = SHIMEVENT_STATSRECEIVED;
Shared::PlatformCommon::Chrono timerStats;
timerStats.start();
while(update(&statsReceived) == NULL && timerStats.getMillis() < 2500) {
SDL_Delay(100);
}
refreshAllStats();
}
void refreshAllStats() {
achievements.clear();
stats.clear();
for(int index = 0; index < EnumParser<SteamStatName>::getCount(); ++index) {
SteamStatName statName = static_cast<SteamStatName>(index);
@ -91,6 +103,9 @@ struct SteamPrivate {
break;
}
}
for (size_t index = 0; index < NUM_ACHIEVEMENTS; ++index) {
STEAMSHIM_getAchievement(achievementNames[index]);
}
Shared::PlatformCommon::Chrono timer;
timer.start();
@ -100,22 +115,19 @@ struct SteamPrivate {
}
}
// void setAchievement(const char *name, bool set)
// {
// achievements[name] = set;
// STEAMSHIM_setAchievement(name, set);
// STEAMSHIM_storeStats();
// }
//
// void updateAchievement(const char *name, bool isSet)
// {
// achievements[name] = isSet;
// }
//
// bool isAchievementSet(const char *name)
// {
// return achievements[name];
// }
void setAchievement(const char *name, bool set) {
achievements[name] = set;
STEAMSHIM_setAchievement(name, set);
//STEAMSHIM_storeStats();
}
void updateAchievement(const char *name, bool isSet) {
achievements[name] = isSet;
}
bool isAchievementSet(const char *name) {
return achievements[name];
}
void updateStat(const char *name, double value) {
stats[name] = value;
@ -151,12 +163,19 @@ struct SteamPrivate {
const STEAMSHIM_Event * update(STEAMSHIM_EventType *waitForEvent=NULL) {
const STEAMSHIM_Event *e;
while ((e = STEAMSHIM_pump()) != 0) {
/* Handle events */
// Handle events
switch (e->type)
{
// case SHIMEVENT_GETACHIEVEMENT:
// updateAchievement(e->name, e->ivalue);
// break;
case SHIMEVENT_GETACHIEVEMENT:
//printf("\nGot Shim event SHIMEVENT_GETACHIEVEMENT name [%s] value [%d] isOk = %d\n",e->name,e->ivalue,e->okay);
if(e->okay) {
updateAchievement(e->name, e->ivalue);
}
break;
case SHIMEVENT_SETACHIEVEMENT:
//printf("\nGot Shim event SHIMEVENT_SETACHIEVEMENT for name [%s] value [%d] isOk = %d\n",e->name,e->ivalue,e->okay);
break;
case SHIMEVENT_GETPERSONANAME:
//printf("\nGot Shim event SHIMEVENT_GETPERSONANAME isOk = %d\n",e->okay);
userName = e->name;
@ -172,7 +191,6 @@ struct SteamPrivate {
//printf("\nGot Shim event SHIMEVENT_STATSSTORED isOk = %d\n",e->okay);
break;
//case SHIMEVENT_SETSTATI:
case SHIMEVENT_GETSTATI:
//printf("\nGot Shim event SHIMEVENT_GETSTATI for stat [%s] value [%d] isOk = %d\n",e->name,e->ivalue,e->okay);
if(e->okay) {
@ -207,8 +225,8 @@ struct SteamPrivate {
bool initialized() {
return !userName.empty()
&& !lang.empty()
&& (int)stats.size() >= EnumParser<SteamStatName>::getCount();
//&& achievements.size() == NUM_ACHIEVEMENTS;
&& (int)stats.size() >= EnumParser<SteamStatName>::getCount()
&& achievements.size() == NUM_ACHIEVEMENTS;
}
};
@ -264,54 +282,31 @@ void Steam::setStatAsDouble(const char *name, double value) {
}
void Steam::requestRefreshStats() {
p->clearLocalStats();
STEAMSHIM_requestStats();
STEAMSHIM_EventType statsReceived = SHIMEVENT_STATSRECEIVED;
p->update(&statsReceived);
for(int index = 0; index < EnumParser<SteamStatName>::getCount(); ++index) {
SteamStatName statName = static_cast<SteamStatName>(index);
string statNameStr = EnumParser<SteamStatName>::getString(statName);
SteamStatType statType = Steam::getSteamStatNameType(statNameStr);
switch(statType) {
case stat_int:
STEAMSHIM_getStatI(statNameStr.c_str());
break;
case stat_float:
STEAMSHIM_getStatF(statNameStr.c_str());
break;
default:
break;
}
}
Shared::PlatformCommon::Chrono timer;
timer.start();
while(!p->initialized() && timer.getMillis() < 2500) {
Shared::PlatformCommon::Chrono timerStats;
timerStats.start();
while(p->update(&statsReceived) == NULL && timerStats.getMillis() < 2500) {
SDL_Delay(100);
p->update();
}
p->refreshAllStats();
}
SteamStatType Steam::getSteamStatNameType(string value) {
return SteamStatNameTypes[value];
}
//void Steam::unlock(const char *name)
//{
// p->setAchievement(name, true);
//}
//
//void Steam::lock(const char *name)
//{
// p->setAchievement(name, false);
//}
//
//bool Steam::isUnlocked(const char *name)
//{
// return p->isAchievementSet(name);
//}
void Steam::unlock(const char *name) {
p->setAchievement(name, true);
}
void Steam::lock(const char *name) {
p->setAchievement(name, false);
}
bool Steam::isUnlocked(const char *name) {
return p->isAchievementSet(name);
}
}}//end namespace

View File

@ -7,7 +7,6 @@
namespace Glest{ namespace Game{
struct SteamPrivate;
enum SteamStatName {
@ -45,9 +44,9 @@ inline EnumParser<SteamStatName>::EnumParser() {
class Steam
{
public:
// void unlock(const char *name);
// void lock(const char *name);
// bool isUnlocked(const char *name);
void unlock(const char *name);
void lock(const char *name);
bool isUnlocked(const char *name);
static SteamStatType getSteamStatNameType(string value);