Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Rubberduckycooly
GitHub Repository: Rubberduckycooly/RSDKv5-Decompilation
Path: blob/master/RSDKv5/RSDK/User/Core/UserAchievements.cpp
1163 views
1
#include "RSDK/Core/RetroEngine.hpp"
2
3
// ====================
4
// API Cores
5
// ====================
6
7
namespace RSDK
8
{
9
namespace SKU
10
{
11
// Dummy API
12
#if RETRO_USERCORE_DUMMY
13
#include "RSDK/User/Dummy/DummyAchievements.cpp"
14
#endif
15
16
// Steam API
17
#if RETRO_USERCORE_STEAM
18
#include "RSDK/User/Steam/SteamAchievements.cpp"
19
#endif
20
21
// Epic Games API
22
#if RETRO_USERCORE_EOS
23
#include "RSDK/User/EOS/EOSAchievements.cpp"
24
#endif
25
26
// Switch API
27
#if RETRO_USERCORE_NX
28
#include "RSDK/User/NX/NXAchievements.cpp"
29
#endif
30
31
} // namespace SKU
32
} // namespace RSDK
33
34
using namespace RSDK;
35
36
#if RETRO_REV02
37
SKU::UserAchievements *RSDK::SKU::achievements = NULL;
38
#endif
39
40
void RSDK::SKU::ClearAchievements() { PrintLog(PRINT_NORMAL, "DUMMY ClearAchievements()"); }
41
42
#if !RETRO_REV02
43
void RSDK::SKU::TryUnlockAchievement(AchievementID *id)
44
{
45
PrintLog(PRINT_NORMAL, "DUMMY TryUnlockAchievement(%s)", id->identifier);
46
47
int32 i = 0;
48
for (; i < (int32)achievementList.size(); ++i) {
49
if (achievementList[i].identifier == id->identifier) {
50
if (!achievementList[i].achieved) {
51
achievementStack.push_back(i);
52
PrintLog(PRINT_NORMAL, "Unlocked Achievement: (%s, %d)", id->identifier, i);
53
achievementList[i].achieved = true;
54
SaveUserData();
55
}
56
break;
57
}
58
}
59
60
if (i == achievementList.size())
61
PrintLog(PRINT_NORMAL, "Failed to Unlock Achievement: (%s)", id->identifier);
62
}
63
#endif
64
65
#if RETRO_VER_EGS || RETRO_USE_DUMMY_ACHIEVEMENTS
66
bool32 RSDK::SKU::achievementsEnabled = true;
67
uint16 RSDK::SKU::achievementAniFrames[2] = { 0, 0 };
68
Animator RSDK::SKU::achievementAnimator[2];
69
String RSDK::SKU::achievementStrings[2];
70
int32 RSDK::SKU::achievementStringWidth[2] = { 0, 0 };
71
int32 RSDK::SKU::achievementID = 0;
72
int32 RSDK::SKU::achievementDisplayDuration = 0;
73
int32 RSDK::SKU::achievementsDrawn = 0;
74
int32 RSDK::SKU::achievementStrW = 0;
75
int32 RSDK::SKU::achievementStrX = 0;
76
bool32 RSDK::SKU::achievementsLoaded = false;
77
bool32 RSDK::SKU::achievementDrawReady = false;
78
bool32 RSDK::SKU::achievementForceReset = false;
79
80
void RSDK::SKU::LoadAchievementAssets()
81
{
82
if (achievements && achievementsEnabled && achievements->CheckAchievementsEnabled()) {
83
if (achievements->CheckAchievementPopupEnabled()) {
84
if (achievementForceReset) {
85
achievementForceReset = false;
86
achievementID = 0;
87
achievementDrawReady = false;
88
achievementDisplayDuration = 0;
89
achievementsDrawn = false;
90
}
91
else {
92
if (achievementID)
93
achievementDisplayDuration = 3 * 60; // 3 seconds
94
}
95
96
achievementsLoaded = !CheckSceneFolder("Logos") && !CheckSceneFolder("Title");
97
98
if (achievementsLoaded) {
99
achievementAniFrames[0] = LoadSpriteAnimation("UI/SmallFont.bin", SCOPE_STAGE);
100
SetSpriteAnimation(achievementAniFrames[0], 0, &achievementAnimator[0], true, 0);
101
102
achievementAniFrames[1] = LoadSpriteAnimation("UI/SmallFont.bin", SCOPE_STAGE);
103
SetSpriteAnimation(achievementAniFrames[1], 0, &achievementAnimator[1], true, 0);
104
}
105
}
106
else {
107
achievementsLoaded = false;
108
}
109
}
110
}
111
void RSDK::SKU::ProcessAchievements()
112
{
113
if (achievementsEnabled && achievements && achievements->CheckAchievementsEnabled()) {
114
if (achievementsLoaded) {
115
if (!achievementID) {
116
achievementID = achievements->GetNextAchievementID();
117
if (achievementID) {
118
achievementDrawReady = true;
119
achievementDisplayDuration = 3 * 60; // 3 seconds
120
achievementsDrawn = false;
121
achievements->RemoveLastAchievementID();
122
123
InitString(&achievementStrings[0], achievementText.c_str(), 0);
124
String buffer;
125
CopyString(&achievementStrings[1], achievements->GetAchievementName(&buffer, achievementID));
126
127
if (curSKU.language == LANGUAGE_JP) {
128
achievementStringWidth[0] = 13 * achievementStrings[0].length;
129
achievementStringWidth[1] = 13 * achievementStrings[1].length;
130
}
131
else {
132
achievementStringWidth[0] =
133
GetStringWidth(achievementAniFrames[0], 0, &achievementStrings[0], 0, achievementStrings[0].length, 0);
134
achievementStringWidth[1] =
135
GetStringWidth(achievementAniFrames[1], 0, &achievementStrings[1], 0, achievementStrings[1].length, 0);
136
}
137
138
achievementStrW = MAX(achievementStringWidth[0], achievementStringWidth[1]) + 16;
139
achievementStrX = achievementStringWidth[1] > achievementStringWidth[0] ? 20 : 0;
140
}
141
}
142
143
if (achievementsDrawn) {
144
if (!--achievementDisplayDuration) {
145
achievementID = 0;
146
achievementDrawReady = false;
147
}
148
}
149
}
150
}
151
}
152
void RSDK::SKU::DrawAchievements()
153
{
154
if (achievementsEnabled && achievements && achievements->CheckAchievementsEnabled()) {
155
if (achievementsLoaded && achievementDrawReady && achievementID) {
156
Vector2 drawPos;
157
158
InitString(&achievementStrings[0], achievementText.c_str(), 0);
159
String buffer;
160
CopyString(&achievementStrings[1], achievements->GetAchievementName(&buffer, achievementID));
161
162
int32 drawX = achievementStrX + currentScreen->size.x - achievementStrW;
163
DrawRectangle(drawX, currentScreen->size.y - 40, achievementStrW - achievementStrX, 40, 0xFF107C, 0x10, INK_NONE, true);
164
165
Vector2 vertices[3];
166
vertices[0].x = TO_FIXED(drawX - 40);
167
vertices[0].y = TO_FIXED(currentScreen->size.y);
168
vertices[1].x = TO_FIXED(drawX);
169
vertices[1].y = TO_FIXED(currentScreen->size.y - 40);
170
vertices[2].x = TO_FIXED(drawX);
171
vertices[2].y = TO_FIXED(currentScreen->size.y);
172
DrawFace(vertices, 3, 0xFF, 0x10, 0x7C, 0x10, INK_NONE);
173
174
drawPos.x = TO_FIXED(drawX - achievementStrX + achievementStrW - 8);
175
drawPos.y = vertices[1].y + TO_FIXED(10);
176
SetSpriteString(achievementAniFrames[0], 0, &achievementStrings[0]);
177
DrawString(&achievementAnimator[0], &drawPos, &achievementStrings[0], 0, achievementStrings[0].length, ALIGN_CENTER, 0, 0, NULL, true);
178
179
vertices[1].y += TO_FIXED(28);
180
181
drawPos.x = TO_FIXED(drawX - achievementStrX + achievementStrW - 8);
182
drawPos.y = vertices[1].y;
183
SetSpriteString(achievementAniFrames[1], 0, &achievementStrings[1]);
184
DrawString(&achievementAnimator[1], &drawPos, &achievementStrings[1], 0, achievementStrings[1].length, ALIGN_CENTER, 0, 0, NULL, true);
185
186
achievementsDrawn = true;
187
}
188
}
189
}
190
191
#endif
192
193
// Start custom achievement code
194
195
// Start Dummy Achievements
196
std::string RSDK::achievementText = "Achievement!";
197
std::vector<RSDK::AchievementInfo> RSDK::achievementList;
198
std::vector<int32> RSDK::achievementStack;
199
// End Dummy Achievements
200
//
201
// this is added because we don't have access to any store APIs that would otherwise use this feature
202
void RSDK::RegisterAchievement(const char *identifier, const char *name, const char *desc)
203
{
204
AchievementInfo info;
205
info.identifier = identifier;
206
info.name = name;
207
info.description = desc;
208
info.achieved = false;
209
achievementList.push_back(info);
210
}
211
212
// End custom achievement code
213