Adds the new steam achievement and leaderboards

This commit is contained in:
Linus Probert 2018-10-18 23:19:33 +02:00
parent d034a69f44
commit 8d09e8a23b
3 changed files with 54 additions and 6 deletions

View File

@ -900,6 +900,23 @@ run_game_render(void)
SDL_RenderPresent(gRenderer); SDL_RenderPresent(gRenderer);
} }
#ifdef STEAM_BUILD
static inline void
register_scores(void)
{
uint8_t details[4] = { (uint8_t) gPlayer->stats.lvl, (uint8_t) cLevel, 0, 0 };
steam_register_score((int) gPlayer->gold, (int32_t*) &details, 1);
steam_register_kills((int) gPlayer->stat_data.kills, (int32_t*) &details, 1);
if (gPlayer->class == ROGUE) {
steam_set_achievement(ROGUE_LIKE);
steam_register_rogue_score((int) gPlayer->gold, (int32_t*) &details, 1);
}
else if (gPlayer->class == WARRIOR) {
steam_register_warrior_score((int) gPlayer->gold, (int32_t*) &details, 1);
}
}
#endif
static void static void
run_game(void) run_game(void)
{ {
@ -925,9 +942,7 @@ run_game(void)
createInGameGameOverMenu(); createInGameGameOverMenu();
hiscore_register(gPlayer, cLevel); hiscore_register(gPlayer, cLevel);
#ifdef STEAM_BUILD #ifdef STEAM_BUILD
uint8_t details[4] = { (uint8_t) gPlayer->stats.lvl, (uint8_t) cLevel, 0, 0 }; register_scores();
steam_register_score((int) gPlayer->gold, (int32_t*) &details, 1);
steam_register_kills((int) gPlayer->stat_data.kills, (int32_t*) &details, 1);
#endif // STEAM_BUILD #endif // STEAM_BUILD
} else { } else {
@ -943,6 +958,7 @@ run_game(void)
end_game_details(); end_game_details();
#ifdef STEAM_BUILD #ifdef STEAM_BUILD
steam_set_achievement(BACK_TO_WORK); steam_set_achievement(BACK_TO_WORK);
register_scores();
#endif // STEAM_BUILD #endif // STEAM_BUILD
} }
} }

View File

@ -8,6 +8,8 @@
#include "../timer.h" #include "../timer.h"
static const char *LB_HIGHSCORE = "Highscore"; static const char *LB_HIGHSCORE = "Highscore";
static const char *LB_ROGUE_HIGHSCORE = "Rogue Highscore";
static const char *LB_WARRIOR_HIGHSCORE = "Warrior Highscore";
static const char *LB_KILLS = "Most Kills"; static const char *LB_KILLS = "Most Kills";
static Achievement g_Achievements[] = { static Achievement g_Achievements[] = {
@ -15,15 +17,18 @@ static Achievement g_Achievements[] = {
_ACH_ID(THE_DOCTOR_IS_OUT, "The Doctor is Out"), _ACH_ID(THE_DOCTOR_IS_OUT, "The Doctor is Out"),
_ACH_ID(LIGHTS_ON, "Omnidirectional light"), _ACH_ID(LIGHTS_ON, "Omnidirectional light"),
_ACH_ID(BACK_TO_WORK, "Back to work"), _ACH_ID(BACK_TO_WORK, "Back to work"),
_ACH_ID(DRAGON_SLAYER, "Platinum dragon slayer") _ACH_ID(DRAGON_SLAYER, "Platinum dragon slayer"),
_ACH_ID(ROGUE_LIKE, "Rogue-like")
}; };
static Uint8 numAchievements = 5; static Uint8 numAchievements = 6;
static bool m_Initiated = false; static bool m_Initiated = false;
static bool m_bStatsReceived = false; static bool m_bStatsReceived = false;
static Sint64 m_AppID = 0; static Sint64 m_AppID = 0;
static Sint64 m_hHighscoreLeaderboard = 0; static Sint64 m_hHighscoreLeaderboard = 0;
static Sint64 m_hKillsLeaderboard = 0; static Sint64 m_hKillsLeaderboard = 0;
static Sint64 m_hRogueHighscore = 0;
static Sint64 m_hWarriorHighscore = 0;
static Timer *requestDataTimer = NULL; static Timer *requestDataTimer = NULL;
@ -56,6 +61,10 @@ leaderboard_received(Sint64 hLeaderboard, const char *name)
m_hHighscoreLeaderboard = hLeaderboard; m_hHighscoreLeaderboard = hLeaderboard;
else if (strcmp(LB_KILLS, name) == 0) else if (strcmp(LB_KILLS, name) == 0)
m_hKillsLeaderboard = hLeaderboard; m_hKillsLeaderboard = hLeaderboard;
else if (strcmp(LB_ROGUE_HIGHSCORE, name) == 0)
m_hRogueHighscore = hLeaderboard;
else if (strcmp(LB_WARRIOR_HIGHSCORE, name) == 0)
m_hWarriorHighscore = hLeaderboard;
} }
bool bool
@ -93,6 +102,10 @@ request_data_queue_run(void)
c_SteamUserStats_FindLeaderboard(LB_HIGHSCORE); c_SteamUserStats_FindLeaderboard(LB_HIGHSCORE);
else if (!m_hKillsLeaderboard) else if (!m_hKillsLeaderboard)
c_SteamUserStats_FindLeaderboard(LB_KILLS); c_SteamUserStats_FindLeaderboard(LB_KILLS);
else if (!m_hRogueHighscore)
c_SteamUserStats_FindLeaderboard(LB_ROGUE_HIGHSCORE);
else if (!m_hWarriorHighscore)
c_SteamUserStats_FindLeaderboard(LB_WARRIOR_HIGHSCORE);
timer_start(requestDataTimer); timer_start(requestDataTimer);
} }
@ -124,6 +137,20 @@ void steam_register_score(Sint32 nScore, const int32_t *details, int32_t nDetail
c_SteamUserStats_UploadLeaderboardScore(m_hHighscoreLeaderboard, nScore, details, nDetails); c_SteamUserStats_UploadLeaderboardScore(m_hHighscoreLeaderboard, nScore, details, nDetails);
} }
void steam_register_warrior_score(Sint32 nScore, const int32_t * details, int32_t nDetails)
{
if (!m_hWarriorHighscore)
return;
c_SteamUserStats_UploadLeaderboardScore(m_hWarriorHighscore, nScore, details, nDetails);
}
void steam_register_rogue_score(Sint32 nScore, const int32_t * details, int32_t nDetails)
{
if (!m_hRogueHighscore)
return;
c_SteamUserStats_UploadLeaderboardScore(m_hRogueHighscore, nScore, details, nDetails);
}
void steam_register_kills(Sint32 nKills, const int32_t *details, int32_t nDetails) void steam_register_kills(Sint32 nKills, const int32_t *details, int32_t nDetails)
{ {
if (!m_hKillsLeaderboard) if (!m_hKillsLeaderboard)

View File

@ -11,7 +11,8 @@ typedef enum EAchievement
BACK_TO_WORK = 5, BACK_TO_WORK = 5,
DRAGON_SLAYER = 6, DRAGON_SLAYER = 6,
BUGGFIXER = 7, BUGGFIXER = 7,
BUGGCREATOR = 8 BUGGCREATOR = 8,
ROGUE_LIKE = 9
} EAchievement; } EAchievement;
@ -37,4 +38,8 @@ void steam_set_achievement(EAchievement eAch);
void steam_register_score(Sint32 nScore, const int32_t *details, int32_t nDetails); void steam_register_score(Sint32 nScore, const int32_t *details, int32_t nDetails);
void steam_register_warrior_score(Sint32 nScore, const int32_t *details, int32_t nDetails);
void steam_register_rogue_score(Sint32 nScore, const int32_t *details, int32_t nDetails);
void steam_register_kills(Sint32 nKills, const int32_t *details, int32_t nDetails); void steam_register_kills(Sint32 nKills, const int32_t *details, int32_t nDetails);