#ifndef __ILEADERBOARD__H__ #define __ILEADERBOARD__H__ #include #include #include #include #include #include "dCommonVars.h" #include "eLeaderboardType.h" class ILeaderboard { public: struct Entry { LWOOBJID charId{}; uint32_t lastPlayedTimestamp{}; float primaryScore{}; float secondaryScore{}; float tertiaryScore{}; uint32_t numWins{}; uint32_t numTimesPlayed{}; uint32_t ranking{}; std::string name{}; }; struct Score { auto operator<=>(const Score& rhs) const = default; float primaryScore{ 0.0f }; float secondaryScore{ 0.0f }; float tertiaryScore{ 0.0f }; }; // Whether a lower primary score ranks higher: races store the time taken. Foot races store the time left on // their countdown, so more is better there, like points. static bool LowerIsBetter(const eLeaderboardType type) { return type == eLeaderboardType::Racing || type == eLeaderboardType::MonumentRace; } // Every score on an activity's leaderboard, best first, in the order the game ranks it (it numbers rows in this order) std::vector GetRankedLeaderboard(const eLeaderboardType type, const uint32_t activityId) { switch (type) { case eLeaderboardType::SurvivalNS: return GetNsLeaderboard(activityId); case eLeaderboardType::Survival: return GetAgsLeaderboard(activityId); default: return LowerIsBetter(type) ? GetAscendingLeaderboard(activityId) : GetDescendingLeaderboard(activityId); } } // Get the donation total for the given activity id. virtual std::optional GetDonationTotal(const uint32_t activityId) = 0; virtual std::vector GetDescendingLeaderboard(const uint32_t activityId) = 0; virtual std::vector GetAscendingLeaderboard(const uint32_t activityId) = 0; virtual std::vector GetNsLeaderboard(const uint32_t activityId) = 0; virtual std::vector GetAgsLeaderboard(const uint32_t activityId) = 0; virtual std::optional GetPlayerScore(const LWOOBJID playerId, const uint32_t gameId) = 0; virtual void SaveScore(const LWOOBJID playerId, const uint32_t gameId, const Score& score) = 0; virtual void UpdateScore(const LWOOBJID playerId, const uint32_t gameId, const Score& score) = 0; virtual void IncrementNumWins(const LWOOBJID playerId, const uint32_t gameId) = 0; virtual void IncrementTimesPlayed(const LWOOBJID playerId, const uint32_t gameId) = 0; // For the dashboard: how many scores each activity has, and removing scores (e.g. cheated ones) virtual std::map GetLeaderboardSizes() = 0; virtual void DeleteLeaderboardScore(const LWOOBJID playerId, const uint32_t gameId) = 0; virtual void ResetLeaderboard(const uint32_t gameId) = 0; }; #endif //!__ILEADERBOARD__H__