Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/Global/APICallback.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: APICallback Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
#if !MANIA_USE_PLUS
11
ObjectAPICallback *APICallback;
12
13
void APICallback_Update(void)
14
{
15
RSDK_THIS(APICallback);
16
StateMachine_Run(self->state);
17
}
18
19
void APICallback_LateUpdate(void) {}
20
21
void APICallback_StaticUpdate(void) {}
22
23
void APICallback_Draw(void) {}
24
25
void APICallback_Create(void *data)
26
{
27
RSDK_THIS(APICallback);
28
29
self->active = ACTIVE_ALWAYS;
30
self->visible = false;
31
self->state = (Type_StateMachine)data;
32
}
33
34
void APICallback_StageLoad(void)
35
{
36
APICallback->achievementsDisabled = false;
37
APICallback->active = ACTIVE_ALWAYS;
38
39
APICallback->LaunchManual = RSDK.GetAPIFunction("LaunchManual");
40
APICallback->ExitGame = RSDK.GetAPIFunction("ExitGame");
41
APICallback->ClearAchievements = RSDK.GetAPIFunction("ClearAchievements");
42
APICallback->UnlockAchievement = RSDK.GetAPIFunction("UnlockAchievement");
43
APICallback->SetRichPresence = RSDK.GetAPIFunction("SetRichPresence");
44
APICallback->FetchLeaderboard = RSDK.GetAPIFunction("FetchLeaderboard");
45
APICallback->LeaderboardStatus = RSDK.GetAPIFunction("LeaderboardStatus");
46
APICallback->LeaderboardEntryCount = RSDK.GetAPIFunction("LeaderboardEntryCount");
47
APICallback->LeaderboardReadEntry = RSDK.GetAPIFunction("LeaderboardReadEntry");
48
APICallback->TrackActClear = RSDK.GetAPIFunction("TrackActClear");
49
APICallback->TrackTAClear = RSDK.GetAPIFunction("TrackTAClear");
50
APICallback->TrackEnemyDefeat = RSDK.GetAPIFunction("TrackEnemyDefeat");
51
APICallback->TrackGameProgress = RSDK.GetAPIFunction("TrackGameProgress");
52
APICallback->ClearPrerollErrors = RSDK.GetAPIFunction("ClearPrerollErrors");
53
APICallback->TryAuth = RSDK.GetAPIFunction("TryAuth");
54
APICallback->GetUserAuthStatus = RSDK.GetAPIFunction("GetUserAuthStatus");
55
APICallback->GetUsername = RSDK.GetAPIFunction("GetUsername");
56
APICallback->TryInitStorage = RSDK.GetAPIFunction("TryInitStorage");
57
APICallback->GetStorageStatus = RSDK.GetAPIFunction("GetStorageStatus");
58
APICallback->LoadUserFile = RSDK.GetAPIFunction("LoadUserFile");
59
APICallback->SaveUserFile = RSDK.GetAPIFunction("SaveUserFile");
60
APICallback->SaveSettingsINI = RSDK.GetAPIFunction("SaveSettingsINI");
61
APICallback->GetUserLanguage = RSDK.GetAPIFunction("GetUserLanguage");
62
APICallback->GetConfirmButtonFlip = RSDK.GetAPIFunction("GetConfirmButtonFlip");
63
APICallback->ControllerIDForInputID = RSDK.GetAPIFunction("ControllerIDForInputID");
64
APICallback->MostRecentActiveControllerID = RSDK.GetAPIFunction("MostRecentActiveControllerID");
65
APICallback->AssignControllerID = RSDK.GetAPIFunction("AssignControllerID");
66
APICallback->ResetControllerAssignments = RSDK.GetAPIFunction("ResetControllerAssignments");
67
APICallback->InputIDIsDisconnected = RSDK.GetAPIFunction("InputIDIsDisconnected");
68
APICallback->GetInputType = RSDK.GetAPIFunction("GetInputType");
69
APICallback->GetControllerType = RSDK.GetAPIFunction("GetControllerType");
70
APICallback->ShowSteamControllerOverlay = RSDK.GetAPIFunction("ShowSteamControllerOverlay");
71
72
APICallback->inputSlots[0] = CONT_P1;
73
APICallback->inputSlots[1] = CONT_P2;
74
APICallback->inputSlots[2] = CONT_P3;
75
APICallback->inputSlots[3] = CONT_P4;
76
APICallback->controllerCount = 4;
77
}
78
79
void APICallback_SetRichPresence(int32 id, String *msg)
80
{
81
if (globals->presenceID != id) {
82
char buffer[0x40];
83
RSDK.GetCString(buffer, msg);
84
85
if (APICallback->SetRichPresence) {
86
LogHelpers_Print("API SetRichPresence(%d)", id);
87
LogHelpers_Print("%s", buffer);
88
89
APICallback->SetRichPresence(id, msg);
90
}
91
else {
92
LogHelpers_Print("EMPTY SetRichPresence(%d)", id);
93
LogHelpers_Print("%s", buffer);
94
}
95
}
96
}
97
98
int32 APICallback_GetUserLanguage(void)
99
{
100
if (APICallback->GetUserLanguage) {
101
return APICallback->GetUserLanguage();
102
}
103
else {
104
LogHelpers_Print("EMPTY GetUserLanguage() -> GameInfo->language (%d)", sku_language);
105
return sku_language;
106
}
107
}
108
109
bool32 APICallback_GetConfirmButtonFlip(void)
110
{
111
if (APICallback->GetConfirmButtonFlip)
112
return APICallback->GetConfirmButtonFlip();
113
114
// LogHelpers_Print("DUMMY GetConfirmButtonFlip()");
115
return false;
116
}
117
118
void APICallback_SetNoSaveEnabled(void)
119
{
120
APICallback->saveStatus = STATUS_ERROR;
121
globals->noSave = true;
122
}
123
124
void APICallback_SetNoSaveDisabled(void)
125
{
126
APICallback->saveStatus = STATUS_FORBIDDEN;
127
globals->noSave = false;
128
}
129
130
void APICallback_SaveUserFile(const char *name, void *buffer, int32 size, void (*callback)(int32))
131
{
132
if (API_GetNoSave()) {
133
LogHelpers_Print("SaveUserFile(%s, %X, %d, %X) failing due to noSave", name, buffer, size, callback);
134
callback(false);
135
}
136
else if (APICallback->SaveUserFile) {
137
LogHelpers_Print("API SaveUserFile(%s, %X, %d, %X)", name, buffer, size, callback);
138
APICallback->SaveUserFile(name, buffer, size, callback);
139
}
140
else {
141
LogHelpers_Print("DUMMY SaveUserFile(%s, %X, %d)", name, buffer, size);
142
EntityAPICallback *entity = CREATE_ENTITY(APICallback, APICallback_HandleCallback, 0, 0);
143
entity->callback = APICallback_SaveCB;
144
entity->timer = 30;
145
entity->fileSize = size;
146
entity->fileName = name;
147
entity->fileBuffer = buffer;
148
entity->fileCallback = callback;
149
}
150
}
151
152
void APICallback_SaveCB(void)
153
{
154
RSDK_THIS(APICallback);
155
156
int32 saveResult = RSDK.SaveUserFile(self->fileName, self->fileBuffer, self->fileSize);
157
LogHelpers_Print("DUMMY DummySaveCB(%s, %x, %d) -> %d", self->fileName, self->fileBuffer, self->fileSize, saveResult);
158
159
if (self->fileCallback)
160
self->fileCallback(true);
161
}
162
163
void APICallback_SaveSettingsINI(void)
164
{
165
if (APICallback->SetRichPresence) {
166
LogHelpers_Print("API SaveSettingsINI(%d)");
167
APICallback->SaveSettingsINI();
168
}
169
else {
170
LogHelpers_Print("EMPTY SaveSettingsINI()");
171
}
172
}
173
174
LeaderboardEntry *APICallback_ReadLeaderboardEntry(int32 rankID)
175
{
176
if (APICallback->LeaderboardReadEntry)
177
return APICallback->LeaderboardReadEntry(rankID);
178
179
if (!sku_platform) {
180
LogHelpers_Print("EMPTY LeaderboardReadEntry()");
181
return NULL;
182
}
183
184
LogHelpers_Print("DUMMY LeaderboardReadEntry()");
185
186
if (APICallback->leaderboardsStatus != STATUS_OK || rankID < 0 || rankID >= APICallback->leaderboardEntryCount) {
187
LogHelpers_Print("ERROR index out of bounds for RankEntry");
188
return NULL;
189
}
190
191
const char *dummyNames[] = { "ORCIHILLARY124", "AUCTORJOLIE521", "SENECTUSFLORENCE789", "MAGNAAVRAM503", "SITVERNON320",
192
"DUICHRISTEN429", "NULLAKERMIT649", "INTEGERGEORGE708", "HENDRERITDREW443", "UTULYSSES507",
193
"ACCUMSANBRUCE276", "BANANAARON804", "MAURISSILAS372", "ETCALVIN641", "UTGALENA780",
194
"FEUGIATSHAY665", "ORCIJULIET388", "ETJENNA318", "LIBEROIDOLA420", "ATVIELKA576",
195
"PHASELLUSJENETTE627", "CONSECTETUERCALEB550", "SITVICTOR359", "PURUSDARRYL50", "DONECAVRAM56",
196
"PENATIBUSSYBILL30", "MAURISBARCLAY563", "CONGUECOLLEEN811", "MORBIDESTINY655", "SEMPERIONA579",
197
"RISUSKEANE807", "QUISQUEMARYAM927", "COMMODOSTEPHANIE54", "MALESUADABURTON350", "VIVAMUSROBIN330",
198
"QUISQUEWHILEMINA413", "VESTIBULUMRYDER890", "LACUSINDIRA112", "NEQUEJESCIE446", "EGESTASMORGAN390",
199
"ETODYSSEUS95", "EGETHERMIONE127", "ENIMPASCALE599", "ODIOWHOOPI328", "DOLORANGELICA718",
200
"ODIOSLOANE426", "DUIZELDA319", "METUSPORTER906", "NONUMMYSHANNON166", "IPSUMANTHONY906",
201
"ACCUMSANRAPHAEL296", "ORNAREHU604", "MOLESTIERYDER304", "FACILISILAITH900", "MIYVONNE287",
202
"CRASHEDY110", "TEMPUSRAE486", "ORCICOLBY173", "ULTRICESJADEN480", "LECTUSBEAU552",
203
"LIGULAJESSAMINE824", "ORCISOLOMON19", "VARIUSDARRYL437", "EUISMODKATELL668", "LACUSSTEVEN302",
204
"ALIQUETRICHARD807", "PEDEKAI692", "VIVAMUSCHARLOTTE167", "MAURISLEWIS101", "NULLANELLE11",
205
"MAECENASKAMEKO602", "LOREMHALEY545", "PHASELLUSPAUL954", "ERATGLORIA527", "DIAMBURKE290",
206
"SEMYOKO792", "ANTEMICHELLE769", "SEMPERDOMINIC873", "CONDIMENTUMNYSSA826", "PEDEDYLAN675",
207
"ETCRUZ380", "VELJAQUELYN95", "NONDACEY190", "UTCAIN386", "NULLANOMLANGA941",
208
"QUISQUESIERRA659", "MATTISABDUL346", "PHASELLUSKNOX183", "NEQUEXYLA92", "ORNAREGAY372",
209
"FACILISISIVY303", "TELLUSHARLAN339", "METUSSOPOLINE75", "NUNCKYLYNN927", "PROINHERMIONE775",
210
"TEMPORFITZGERALD656", "VELVELMA504", "FAUCIBUSTAMEKAH272", "PORTTITORWHOOPI881", "EUPETER41" };
211
212
APICallback->leaderboardEntry.globalRank = rankID + (APICallback->rankScore + 1);
213
APICallback->leaderboardEntry.score = (4 * APICallback->leaderboardEntry.globalRank + 2400) % 59999;
214
APICallback->leaderboardEntry.isUser = APICallback->prevIsUser && rankID == APICallback->prevRank;
215
if (APICallback->leaderboardEntry.isUser) {
216
RSDK.InitString(&APICallback->leaderboardEntry.username, "YOU", 0);
217
LogHelpers_Print("RSDKRankEntry { globalRank: %d, score: %d, entryName: %s, isUser: %d }", APICallback->leaderboardEntry.globalRank,
218
APICallback->leaderboardEntry.score, "YOU", APICallback->leaderboardEntry.isUser);
219
}
220
else {
221
RSDK.InitString(&APICallback->leaderboardEntry.username, "", 0);
222
RSDK.SetString(&APICallback->leaderboardEntry.username, dummyNames[rankID]);
223
LogHelpers_Print("RSDKRankEntry { globalRank: %d, score: %d, entryName: %s, isUser: %d }", APICallback->leaderboardEntry.globalRank,
224
APICallback->leaderboardEntry.score, dummyNames[rankID], APICallback->leaderboardEntry.isUser);
225
}
226
return &APICallback->leaderboardEntry;
227
}
228
229
void APICallback_NotifyAutoSave_OK(void)
230
{
231
APICallback->isAutoSaving = false;
232
globals->notifiedAutosave = true;
233
UIWaitSpinner_FinishWait();
234
}
235
236
void APICallback_NotifyAutoSave_CB(void)
237
{
238
RSDK_THIS(APICallback);
239
240
if (APICallback->isAutoSaving) {
241
if (!UIDialog->activeDialog) {
242
String string;
243
Localization_GetString(&string, STR_AUTOSAVENOTIF);
244
EntityUIDialog *dialog = UIDialog_CreateDialogOk(&string, APICallback_NotifyAutoSave_OK, true);
245
dialog->useAltColor = true;
246
}
247
}
248
else {
249
APICallback->activeEntity = NULL;
250
destroyEntity(self);
251
}
252
}
253
254
void APICallback_PromptSavePreference_CB(void)
255
{
256
RSDK_THIS(APICallback);
257
258
if (APICallback->saveStatus == STATUS_CONTINUE) {
259
if (!UIDialog->activeDialog) {
260
String string;
261
262
int32 stringID = STR_SAVELOADFAIL;
263
switch (self->status) {
264
case STATUS_ERROR:
265
stringID = STR_NOXBOXPROFILE;
266
if (sku_platform != PLATFORM_XB1)
267
stringID = STR_SAVELOADFAIL;
268
break;
269
case STATUS_CORRUPT: stringID = STR_CORRUPTSAVE; break;
270
case STATUS_NOSPACE: stringID = (sku_platform == PLATFORM_XB1) + STR_NOSAVESPACE; break;
271
}
272
Localization_GetString(&string, stringID);
273
274
EntityUIDialog *dialog = UIDialog_CreateDialogYesNo(&string, APICallback_SetNoSaveEnabled, APICallback_SetNoSaveDisabled, true, true);
275
dialog->useAltColor = true;
276
}
277
}
278
else {
279
APICallback->activeEntity = NULL;
280
destroyEntity(self);
281
}
282
}
283
284
void APICallback_PromptSavePreference(int32 status)
285
{
286
if (API_GetNoSave()) {
287
LogHelpers_Print("PromptSavePreference() returning due to noSave");
288
return;
289
}
290
291
LogHelpers_Print("PromptSavePreference()");
292
293
if (APICallback->saveStatus == STATUS_CONTINUE)
294
LogHelpers_Print("WARNING PromptSavePreference() when prompt already in progress.");
295
296
APICallback->saveStatus = STATUS_CONTINUE;
297
298
EntityAPICallback *entity = CREATE_ENTITY(APICallback, APICallback_PromptSavePreference_CB, 0, 0);
299
entity->status = status;
300
APICallback->activeEntity = (Entity *)entity;
301
}
302
303
void APICallback_LoadUserFile(const char *name, void *buffer, int32 size, void (*callback)(int32))
304
{
305
if (API_GetNoSave()) {
306
LogHelpers_Print("LoadUserFile(%s, %X, %d, %X) loading 0's due to noSave", name, buffer, size, callback);
307
memset(buffer, 0, size);
308
callback(false);
309
}
310
else if (APICallback->LoadUserFile) {
311
LogHelpers_Print("API LoadUserFile(%s, %X, %d, %X)", name, buffer, size, callback);
312
APICallback->LoadUserFile(name, buffer, size, callback);
313
}
314
else {
315
LogHelpers_Print("DUMMY LoadUserFile(%s, %X, %d)", name, buffer, size);
316
EntityAPICallback *entity = CREATE_ENTITY(APICallback, APICallback_HandleCallback, 0, 0);
317
entity->callback = APICallback_LoadCB;
318
entity->timer = 60;
319
entity->fileSize = size;
320
entity->fileName = name;
321
entity->fileBuffer = buffer;
322
entity->fileCallback = callback;
323
}
324
}
325
326
void APICallback_LoadCB(void)
327
{
328
RSDK_THIS(APICallback);
329
330
int32 loadResult = RSDK.LoadUserFile(self->fileName, self->fileBuffer, self->fileSize);
331
LogHelpers_Print("DUMMY DummyLoadCB(%s, %x, %d) -> %d", self->fileName, self->fileBuffer, self->fileSize, loadResult);
332
333
if (self->fileCallback)
334
self->fileCallback(true);
335
}
336
337
int32 APICallback_LeaderboardStatus(void)
338
{
339
if (APICallback->LeaderboardStatus)
340
return APICallback->LeaderboardStatus();
341
342
int32 status = 0;
343
if (sku_platform < PLATFORM_PS4) {
344
LogHelpers_Print("EMPTY LeaderboardStatus()");
345
status = 0;
346
}
347
else {
348
LogHelpers_Print("DUMMY LeaderboardStatus()");
349
350
if (APICallback->leaderboardsStatus == STATUS_CONTINUE) {
351
if (APICallback->statusTimer < 60) {
352
APICallback->statusTimer++;
353
return APICallback->leaderboardsStatus;
354
}
355
356
if ((RSDK.Rand(0, 100) % 10) > 10)
357
APICallback->leaderboardsStatus = STATUS_ERROR;
358
else
359
APICallback->leaderboardsStatus = STATUS_OK;
360
}
361
status = APICallback->leaderboardsStatus;
362
}
363
364
return status;
365
}
366
367
int32 APICallback_LeaderboardEntryCount(void)
368
{
369
if (APICallback->LeaderboardEntryCount)
370
return APICallback->LeaderboardEntryCount();
371
372
if (sku_platform < PLATFORM_PS4) {
373
LogHelpers_Print("EMPTY LeaderboardEntryCount()");
374
}
375
else {
376
LogHelpers_Print("DUMMY LeaderboardEntryCount()");
377
if (APICallback->leaderboardsStatus == STATUS_OK)
378
return APICallback->leaderboardEntryCount;
379
}
380
381
return -1;
382
}
383
384
void APICallback_LaunchManual()
385
{
386
if (APICallback->LaunchManual)
387
APICallback->LaunchManual();
388
else if (sku_platform == PLATFORM_DEV)
389
LogHelpers_Print("DUMMY LaunchManual()");
390
else
391
LogHelpers_Print("EMPTY LaunchManual()");
392
}
393
394
void APICallback_HandleCallback(void)
395
{
396
RSDK_THIS(APICallback);
397
398
if (self->timer <= 0) {
399
LogHelpers_Print("Callback: %x", self->callback);
400
StateMachine_Run(self->callback);
401
destroyEntity(self);
402
}
403
else {
404
self->timer--;
405
}
406
}
407
408
int32 APICallback_GetUserAuthStatus(void)
409
{
410
if (APICallback->GetUserAuthStatus)
411
APICallback->authStatus = APICallback->GetUserAuthStatus();
412
else
413
APICallback->authStatus = STATUS_OK;
414
415
if (APICallback->saveStatus || APICallback->authStatus != STATUS_ERROR) {
416
if (APICallback->authStatus == STATUS_FORBIDDEN && !APICallback->authForbidden) {
417
EntityAPICallback *entity = CREATE_ENTITY(APICallback, APICallback_CheckUserAuth_CB, 0, 0);
418
entity->active = ACTIVE_ALWAYS;
419
APICallback->activeEntity = (Entity *)entity;
420
APICallback->authForbidden = true;
421
}
422
}
423
else {
424
APICallback->saveStatus = STATUS_ERROR;
425
}
426
427
return APICallback->authStatus;
428
}
429
430
int32 APICallback_GetStorageStatus(void)
431
{
432
if (APICallback->saveStatus == STATUS_ERROR)
433
return STATUS_ERROR;
434
435
int32 status = 0;
436
if (APICallback->GetStorageStatus) {
437
status = APICallback->GetStorageStatus(0);
438
}
439
else { // normally this is "if sku_platform != PLATFORM_PC" but we don't have a get storage status so lets pretend that check doesn't exist
440
if (APICallback->activeEntity) {
441
status = STATUS_CONTINUE;
442
}
443
else {
444
if (APICallback->storageStatus == STATUS_CONTINUE) {
445
if (APICallback->statusTimer >= 0) {
446
if (RSDK.Rand(0, 100) % 10 > 10)
447
APICallback->storageStatus = STATUS_ERROR;
448
else
449
APICallback->storageStatus = STATUS_OK;
450
}
451
else {
452
APICallback->statusTimer++;
453
}
454
}
455
status = APICallback->storageStatus;
456
}
457
}
458
459
if (!APICallback->saveStatus) {
460
if (status == STATUS_ERROR) {
461
APICallback->saveStatus = STATUS_ERROR;
462
return STATUS_ERROR;
463
}
464
if (status == STATUS_OK)
465
APICallback->saveStatus = STATUS_OK;
466
}
467
468
return status;
469
}
470
471
int32 APICallback_GetSaveStatus(void)
472
{
473
if (API_GetNoSave())
474
return STATUS_OK;
475
476
if (APICallback->activeEntity)
477
return STATUS_CONTINUE;
478
else
479
return APICallback->saveStatus;
480
}
481
482
int32 APICallback_GetControllerType(int32 deviceID)
483
{
484
if (APICallback->GetControllerType)
485
return APICallback->GetControllerType(deviceID);
486
else
487
return sku_platform == PLATFORM_DEV;
488
}
489
490
int32 APICallback_FetchLeaderboardData(uint8 zoneID, uint8 actID, int32 playerID, int32 start, int32 end, bool32 isUser)
491
{
492
if (APICallback->FetchLeaderboard)
493
return APICallback->FetchLeaderboard(zoneID, actID, playerID, start, end, isUser);
494
495
if (sku_platform < PLATFORM_PS4) {
496
LogHelpers_Print("EMPTY FetchLeaderboardData(%d, %d, %d, %d, %d, %d)", zoneID, actID, playerID, start, end, isUser);
497
return 0;
498
}
499
500
LogHelpers_Print("DUMMY FetchLeaderboardData(%d, %d, %d, %d, %d, %d)", zoneID, actID, playerID, start, end, isUser);
501
if (APICallback->leaderboardsStatus == STATUS_CONTINUE) {
502
LogHelpers_Print("WARNING Called FetchLeaderboard() while loading");
503
return 0;
504
}
505
506
APICallback->rankScore = 0;
507
APICallback->leaderboardEntryCount = RSDK.Rand(start, end);
508
APICallback->prevIsUser = isUser;
509
if (isUser) {
510
APICallback->rankScore = RSDK.Rand(1000, 9999);
511
APICallback->prevRank = RSDK.Rand(0, APICallback->leaderboardEntryCount - 1);
512
}
513
APICallback->leaderboardsStatus = STATUS_CONTINUE;
514
APICallback->statusTimer = 0;
515
return 0;
516
}
517
518
void APICallback_ExitGame(void)
519
{
520
if (APICallback->ExitGame) {
521
APICallback->ExitGame();
522
}
523
else {
524
if (sku_platform == PLATFORM_DEV)
525
exit(0);
526
527
LogHelpers_Print("EMPTY ExitGame()");
528
}
529
}
530
531
void APICallback_ClearPrerollErrors(void)
532
{
533
if (APICallback->ClearPrerollErrors) {
534
LogHelpers_Print("API ClearPrerollErrors()");
535
APICallback->ClearPrerollErrors();
536
}
537
else {
538
LogHelpers_Print("DUMMY ClearPrerollErrors()");
539
540
if (APICallback->authStatus != STATUS_OK) {
541
APICallback->authStatus = STATUS_NONE;
542
}
543
if (APICallback->storageStatus != STATUS_OK)
544
APICallback->storageStatus = STATUS_NONE;
545
}
546
}
547
548
bool32 APICallback_CheckInputDisconnected(void)
549
{
550
RSDK_THIS(APICallback);
551
552
return APICallback_InputIDIsDisconnected(self->deviceID) || PauseMenu->forcedDisconnect;
553
}
554
555
bool32 APICallback_InputIDIsDisconnected(uint8 inputSlot)
556
{
557
if (APICallback->InputIDIsDisconnected) {
558
return APICallback->InputIDIsDisconnected(inputSlot);
559
}
560
else {
561
LogHelpers_Print("DUMMY InputIDIsDisconnected()");
562
return APICallback->inputSlots[inputSlot];
563
}
564
}
565
566
int32 APICallback_ControllerIDForInputID(uint8 inputSlot)
567
{
568
if (APICallback->ControllerIDForInputID) {
569
return APICallback->ControllerIDForInputID(inputSlot);
570
}
571
else {
572
LogHelpers_Print("DUMMY ControllerIDForInputID()");
573
return 1;
574
}
575
}
576
int32 APICallback_MostRecentActiveControllerID(uint8 inputSlot)
577
{
578
if (APICallback->MostRecentActiveControllerID) {
579
return APICallback->MostRecentActiveControllerID(inputSlot);
580
}
581
else {
582
LogHelpers_Print("DUMMY MostRecentActiveControllerID()");
583
return 1;
584
}
585
}
586
void APICallback_AssignControllerID(uint8 inputSlot, int32 deviceID)
587
{
588
if (APICallback->AssignControllerID) {
589
APICallback->AssignControllerID(inputSlot, deviceID);
590
}
591
else {
592
LogHelpers_Print("DUMMY AssignControllerID()");
593
APICallback->inputSlots[inputSlot] = deviceID;
594
}
595
}
596
void APICallback_ResetControllerAssignments(void)
597
{
598
if (APICallback->ResetControllerAssignments) {
599
APICallback->ResetControllerAssignments();
600
}
601
else {
602
LogHelpers_Print("DUMMY ResetControllerAssignments()");
603
APICallback->inputSlots[0] = 0;
604
APICallback->inputSlots[1] = 0;
605
APICallback->inputSlots[2] = 0;
606
APICallback->inputSlots[3] = 0;
607
}
608
}
609
610
void APICallback_TrackActClear(uint8 zoneID, uint8 actID, uint8 playerID, int32 time, int32 rings, int32 score)
611
{
612
if (APICallback->TrackActClear)
613
APICallback->TrackActClear(zoneID, actID, playerID, score, rings, time);
614
else
615
LogHelpers_Print("EMPTY TrackActClear(%d, %d, %d, %d, %d, %d)", zoneID, actID, playerID, score, rings, time);
616
}
617
void APICallback_TrackTAClear(uint8 zoneID, uint8 actID, uint8 playerID, int32 time)
618
{
619
if (APICallback->TrackTAClear)
620
APICallback->TrackTAClear(zoneID, actID, playerID, time);
621
else
622
LogHelpers_Print("EMPTY TrackTAClear(%d, %d, %d, %d)", zoneID, actID, playerID, time);
623
}
624
void APICallback_TrackEnemyDefeat(uint8 zoneID, uint8 actID, uint8 playerID, int32 x, int32 y)
625
{
626
if (APICallback->TrackEnemyDefeat)
627
APICallback->TrackEnemyDefeat(zoneID, actID, playerID, x, y);
628
else
629
LogHelpers_Print("EMPTY TrackEnemyDefeat(%d, %d, %d, %d, %d)", zoneID, actID, playerID, x, y);
630
}
631
632
void APICallback_TrackGameProgress(float percent)
633
{
634
if (APICallback->TrackGameProgress)
635
APICallback->TrackGameProgress(percent);
636
else
637
LogHelpers_Print("EMPTY TrackGameProgress(%f)", percent);
638
}
639
640
void APICallback_TryAuth_No(void)
641
{
642
APICallback->authStatus = STATUS_ERROR;
643
APICallback->saveStatus = STATUS_ERROR;
644
}
645
646
void APICallback_TryAuth_Yes(void) { APICallback->authStatus = STATUS_OK; }
647
648
void APICallback_TryAuth_CB(void)
649
{
650
RSDK_THIS(APICallback);
651
652
if (APICallback->authStatus == STATUS_CONTINUE) {
653
if (!UIDialog->activeDialog) {
654
String string;
655
switch (sku_platform) {
656
case PLATFORM_PC:
657
#if MANIA_USE_EGS
658
Localization_GetString(&string, STR_LOADEGS);
659
#else
660
Localization_GetString(&string, STR_LOADSTEAM);
661
#endif
662
break;
663
case PLATFORM_PS4: Localization_GetString(&string, STR_LOADPSN); break;
664
case PLATFORM_XB1: Localization_GetString(&string, STR_LOADXBOX); break;
665
case PLATFORM_SWITCH: Localization_GetString(&string, STR_LOADNINTENDO); break;
666
}
667
668
EntityUIDialog *dialog = UIDialog_CreateDialogYesNo(&string, APICallback_TryAuth_Yes, APICallback_TryAuth_No, true, true);
669
dialog->useAltColor = true;
670
}
671
}
672
else {
673
APICallback->activeEntity = NULL;
674
destroyEntity(self);
675
}
676
}
677
678
int32 APICallback_TryAuth(void)
679
{
680
if (APICallback->TryAuth) {
681
LogHelpers_Print("API TryAuth()");
682
return APICallback->TryAuth();
683
}
684
else {
685
LogHelpers_Print("DUMMY TryAuth()");
686
if (APICallback->authStatus == STATUS_CONTINUE) {
687
LogHelpers_Print("WARNING TryAuth() when auth already in progress.");
688
}
689
APICallback->statusTimer = 0;
690
APICallback->authStatus = STATUS_CONTINUE;
691
CREATE_ENTITY(APICallback, APICallback_TryAuth_CB, 0, 0);
692
693
return STATUS_CONTINUE;
694
}
695
}
696
697
void APICallback_TryInitStorage(void)
698
{
699
if (APICallback->TryInitStorage) {
700
LogHelpers_Print("API TryInitStorage()");
701
APICallback->TryInitStorage();
702
}
703
else {
704
LogHelpers_Print("DUMMY TryInitStorage()");
705
if (APICallback->storageStatus == STATUS_CONTINUE) {
706
LogHelpers_Print("WARNING TryInitStorage() when init already in progress.");
707
}
708
APICallback->statusTimer = 0;
709
APICallback->storageStatus = STATUS_CONTINUE;
710
}
711
}
712
713
bool32 APICallback_GetUsername(String *userName)
714
{
715
if (APICallback->GetUsername) {
716
LogHelpers_Print("API GetUsername()");
717
APICallback->GetUsername(userName);
718
return true;
719
}
720
else {
721
if (sku_platform == PLATFORM_DEV) {
722
LogHelpers_Print("DUMMY GetUsername()");
723
RSDK.InitString(userName, "IntegerGeorge802", 0);
724
return true;
725
}
726
else {
727
LogHelpers_Print("EMPTY GetUsername()");
728
}
729
}
730
731
return false;
732
}
733
734
void APICallback_ClearAchievements(void)
735
{
736
if (APICallback->ClearAchievements)
737
APICallback->ClearAchievements();
738
else if (sku_platform == PLATFORM_DEV)
739
LogHelpers_Print("DUMMY ClearAchievements()");
740
else
741
LogHelpers_Print("EMPTY ClearAchievements()");
742
}
743
744
void APICallback_UnlockAchievement(const char *name)
745
{
746
// Silly Workaround
747
AchievementID id;
748
id.id = name;
749
750
if (APICallback->achievementsDisabled)
751
LogHelpers_Print("SKIP UnlockAchievement(%s)", name);
752
else if (APICallback->UnlockAchievement)
753
APICallback->UnlockAchievement(&id);
754
else if (sku_platform == PLATFORM_DEV)
755
LogHelpers_Print("DUMMY UnlockAchievement(%s)", name);
756
else
757
LogHelpers_Print("EMPTY UnlockAchievement(%s)", name);
758
}
759
760
void APICallback_CheckUserAuth_OK(void) { APICallback->signedOut = true; }
761
762
void APICallback_CheckUserAuth_CB(void)
763
{
764
RSDK_THIS(APICallback);
765
766
EntityUIDialog *dialog = UIDialog->activeDialog;
767
if (self->timer) {
768
if (APICallback->signedOut) {
769
if (!dialog) {
770
if (Zone) {
771
RSDK.SetScene("Presentation", "Title Screen");
772
Zone_StartFadeOut(10, 0x000000);
773
}
774
else if (MenuSetup) {
775
MenuSetup_StartReturnToTitle();
776
}
777
778
APICallback->activeEntity = NULL;
779
destroyEntity(self);
780
}
781
}
782
else if (!dialog) {
783
String string;
784
Localization_GetString(&string, STR_SIGNOUTDETECTED);
785
dialog = UIDialog_CreateDialogOk(&string, APICallback_CheckUserAuth_OK, true);
786
dialog->useAltColor = true;
787
}
788
}
789
else {
790
if (dialog) {
791
UIDialog_CloseOnSel_HandleSelection(dialog, StateMachine_None);
792
}
793
else {
794
if (UIControl) {
795
if (UIControl_GetUIControl())
796
UIControl_SetInactiveMenu(UIControl_GetUIControl());
797
}
798
799
RSDK.SetEngineState(ENGINESTATE_FROZEN);
800
Music_Stop();
801
self->timer = 1;
802
}
803
}
804
}
805
806
void APICallback_TrackGameProgressCB(void) { UIWaitSpinner_FinishWait(); }
807
808
void APICallback_GetNextNotif(void)
809
{
810
if (SceneInfo->inEditor || API_GetNoSave() || globals->saveLoaded != STATUS_OK) {
811
return;
812
}
813
else {
814
ProgressRAM *progress = GameProgress_GetProgressRAM();
815
progress->unreadNotifs[GameProgress_GetNextNotif()] = true;
816
}
817
}
818
819
void APICallback_ManageNotifs(void)
820
{
821
RSDK_THIS(APICallback);
822
823
if (GameProgress_CountUnreadNotifs()) {
824
String string;
825
INIT_STRING(string);
826
if (!UIDialog->activeDialog) {
827
int32 str = GameProgress_GetNotifStringID(GameProgress_GetNextNotif());
828
Localization_GetString(&string, str);
829
EntityUIDialog *dialog = UIDialog_CreateDialogOk(&string, APICallback_GetNextNotif, true);
830
dialog->playEventSfx = true;
831
dialog->useAltColor = true;
832
}
833
}
834
else {
835
APICallback->activeEntity = NULL;
836
UIWaitSpinner_StartWait();
837
GameProgress_TrackGameProgress(APICallback_TrackGameProgressCB);
838
destroyEntity(self);
839
}
840
}
841
842
bool32 APICallback_CheckUnreadNotifs(void)
843
{
844
if (!GameProgress_CountUnreadNotifs())
845
return false;
846
847
if (!APICallback->activeEntity)
848
APICallback->activeEntity = (Entity *)CREATE_ENTITY(APICallback, APICallback_ManageNotifs, 0, 0);
849
850
return true;
851
}
852
853
bool32 APICallback_NotifyAutosave(void)
854
{
855
if (globals->notifiedAutosave) {
856
if (!APICallback->isAutoSaving && !APICallback->activeEntity)
857
return false;
858
}
859
else if (!APICallback->isAutoSaving || !APICallback->activeEntity) {
860
UIWaitSpinner_StartWait();
861
APICallback->isAutoSaving = true;
862
globals->notifiedAutosave = false;
863
LogHelpers_Print("DUMMY NotifyAutosave()");
864
EntityAPICallback *dialogRunner = CREATE_ENTITY(APICallback, APICallback_NotifyAutoSave_CB, 0, 0);
865
dialogRunner->active = ACTIVE_ALWAYS;
866
APICallback->activeEntity = (Entity *)dialogRunner;
867
}
868
869
return true;
870
}
871
872
#if GAME_INCLUDE_EDITOR
873
void APICallback_EditorDraw(void) {}
874
875
void APICallback_EditorLoad(void) {}
876
#endif
877
878
void APICallback_Serialize(void) {}
879
880
#endif
881
882