Path: blob/master/RSDKv5/RSDK/User/Core/UserAchievements.cpp
1163 views
#include "RSDK/Core/RetroEngine.hpp"12// ====================3// API Cores4// ====================56namespace RSDK7{8namespace SKU9{10// Dummy API11#if RETRO_USERCORE_DUMMY12#include "RSDK/User/Dummy/DummyAchievements.cpp"13#endif1415// Steam API16#if RETRO_USERCORE_STEAM17#include "RSDK/User/Steam/SteamAchievements.cpp"18#endif1920// Epic Games API21#if RETRO_USERCORE_EOS22#include "RSDK/User/EOS/EOSAchievements.cpp"23#endif2425// Switch API26#if RETRO_USERCORE_NX27#include "RSDK/User/NX/NXAchievements.cpp"28#endif2930} // namespace SKU31} // namespace RSDK3233using namespace RSDK;3435#if RETRO_REV0236SKU::UserAchievements *RSDK::SKU::achievements = NULL;37#endif3839void RSDK::SKU::ClearAchievements() { PrintLog(PRINT_NORMAL, "DUMMY ClearAchievements()"); }4041#if !RETRO_REV0242void RSDK::SKU::TryUnlockAchievement(AchievementID *id)43{44PrintLog(PRINT_NORMAL, "DUMMY TryUnlockAchievement(%s)", id->identifier);4546int32 i = 0;47for (; i < (int32)achievementList.size(); ++i) {48if (achievementList[i].identifier == id->identifier) {49if (!achievementList[i].achieved) {50achievementStack.push_back(i);51PrintLog(PRINT_NORMAL, "Unlocked Achievement: (%s, %d)", id->identifier, i);52achievementList[i].achieved = true;53SaveUserData();54}55break;56}57}5859if (i == achievementList.size())60PrintLog(PRINT_NORMAL, "Failed to Unlock Achievement: (%s)", id->identifier);61}62#endif6364#if RETRO_VER_EGS || RETRO_USE_DUMMY_ACHIEVEMENTS65bool32 RSDK::SKU::achievementsEnabled = true;66uint16 RSDK::SKU::achievementAniFrames[2] = { 0, 0 };67Animator RSDK::SKU::achievementAnimator[2];68String RSDK::SKU::achievementStrings[2];69int32 RSDK::SKU::achievementStringWidth[2] = { 0, 0 };70int32 RSDK::SKU::achievementID = 0;71int32 RSDK::SKU::achievementDisplayDuration = 0;72int32 RSDK::SKU::achievementsDrawn = 0;73int32 RSDK::SKU::achievementStrW = 0;74int32 RSDK::SKU::achievementStrX = 0;75bool32 RSDK::SKU::achievementsLoaded = false;76bool32 RSDK::SKU::achievementDrawReady = false;77bool32 RSDK::SKU::achievementForceReset = false;7879void RSDK::SKU::LoadAchievementAssets()80{81if (achievements && achievementsEnabled && achievements->CheckAchievementsEnabled()) {82if (achievements->CheckAchievementPopupEnabled()) {83if (achievementForceReset) {84achievementForceReset = false;85achievementID = 0;86achievementDrawReady = false;87achievementDisplayDuration = 0;88achievementsDrawn = false;89}90else {91if (achievementID)92achievementDisplayDuration = 3 * 60; // 3 seconds93}9495achievementsLoaded = !CheckSceneFolder("Logos") && !CheckSceneFolder("Title");9697if (achievementsLoaded) {98achievementAniFrames[0] = LoadSpriteAnimation("UI/SmallFont.bin", SCOPE_STAGE);99SetSpriteAnimation(achievementAniFrames[0], 0, &achievementAnimator[0], true, 0);100101achievementAniFrames[1] = LoadSpriteAnimation("UI/SmallFont.bin", SCOPE_STAGE);102SetSpriteAnimation(achievementAniFrames[1], 0, &achievementAnimator[1], true, 0);103}104}105else {106achievementsLoaded = false;107}108}109}110void RSDK::SKU::ProcessAchievements()111{112if (achievementsEnabled && achievements && achievements->CheckAchievementsEnabled()) {113if (achievementsLoaded) {114if (!achievementID) {115achievementID = achievements->GetNextAchievementID();116if (achievementID) {117achievementDrawReady = true;118achievementDisplayDuration = 3 * 60; // 3 seconds119achievementsDrawn = false;120achievements->RemoveLastAchievementID();121122InitString(&achievementStrings[0], achievementText.c_str(), 0);123String buffer;124CopyString(&achievementStrings[1], achievements->GetAchievementName(&buffer, achievementID));125126if (curSKU.language == LANGUAGE_JP) {127achievementStringWidth[0] = 13 * achievementStrings[0].length;128achievementStringWidth[1] = 13 * achievementStrings[1].length;129}130else {131achievementStringWidth[0] =132GetStringWidth(achievementAniFrames[0], 0, &achievementStrings[0], 0, achievementStrings[0].length, 0);133achievementStringWidth[1] =134GetStringWidth(achievementAniFrames[1], 0, &achievementStrings[1], 0, achievementStrings[1].length, 0);135}136137achievementStrW = MAX(achievementStringWidth[0], achievementStringWidth[1]) + 16;138achievementStrX = achievementStringWidth[1] > achievementStringWidth[0] ? 20 : 0;139}140}141142if (achievementsDrawn) {143if (!--achievementDisplayDuration) {144achievementID = 0;145achievementDrawReady = false;146}147}148}149}150}151void RSDK::SKU::DrawAchievements()152{153if (achievementsEnabled && achievements && achievements->CheckAchievementsEnabled()) {154if (achievementsLoaded && achievementDrawReady && achievementID) {155Vector2 drawPos;156157InitString(&achievementStrings[0], achievementText.c_str(), 0);158String buffer;159CopyString(&achievementStrings[1], achievements->GetAchievementName(&buffer, achievementID));160161int32 drawX = achievementStrX + currentScreen->size.x - achievementStrW;162DrawRectangle(drawX, currentScreen->size.y - 40, achievementStrW - achievementStrX, 40, 0xFF107C, 0x10, INK_NONE, true);163164Vector2 vertices[3];165vertices[0].x = TO_FIXED(drawX - 40);166vertices[0].y = TO_FIXED(currentScreen->size.y);167vertices[1].x = TO_FIXED(drawX);168vertices[1].y = TO_FIXED(currentScreen->size.y - 40);169vertices[2].x = TO_FIXED(drawX);170vertices[2].y = TO_FIXED(currentScreen->size.y);171DrawFace(vertices, 3, 0xFF, 0x10, 0x7C, 0x10, INK_NONE);172173drawPos.x = TO_FIXED(drawX - achievementStrX + achievementStrW - 8);174drawPos.y = vertices[1].y + TO_FIXED(10);175SetSpriteString(achievementAniFrames[0], 0, &achievementStrings[0]);176DrawString(&achievementAnimator[0], &drawPos, &achievementStrings[0], 0, achievementStrings[0].length, ALIGN_CENTER, 0, 0, NULL, true);177178vertices[1].y += TO_FIXED(28);179180drawPos.x = TO_FIXED(drawX - achievementStrX + achievementStrW - 8);181drawPos.y = vertices[1].y;182SetSpriteString(achievementAniFrames[1], 0, &achievementStrings[1]);183DrawString(&achievementAnimator[1], &drawPos, &achievementStrings[1], 0, achievementStrings[1].length, ALIGN_CENTER, 0, 0, NULL, true);184185achievementsDrawn = true;186}187}188}189190#endif191192// Start custom achievement code193194// Start Dummy Achievements195std::string RSDK::achievementText = "Achievement!";196std::vector<RSDK::AchievementInfo> RSDK::achievementList;197std::vector<int32> RSDK::achievementStack;198// End Dummy Achievements199//200// this is added because we don't have access to any store APIs that would otherwise use this feature201void RSDK::RegisterAchievement(const char *identifier, const char *name, const char *desc)202{203AchievementInfo info;204info.identifier = identifier;205info.name = name;206info.description = desc;207info.achieved = false;208achievementList.push_back(info);209}210211// End custom achievement code212213