Path: blob/master/SonicMania/Objects/Global/APICallback.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: APICallback Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89#if !MANIA_USE_PLUS10ObjectAPICallback *APICallback;1112void APICallback_Update(void)13{14RSDK_THIS(APICallback);15StateMachine_Run(self->state);16}1718void APICallback_LateUpdate(void) {}1920void APICallback_StaticUpdate(void) {}2122void APICallback_Draw(void) {}2324void APICallback_Create(void *data)25{26RSDK_THIS(APICallback);2728self->active = ACTIVE_ALWAYS;29self->visible = false;30self->state = (Type_StateMachine)data;31}3233void APICallback_StageLoad(void)34{35APICallback->achievementsDisabled = false;36APICallback->active = ACTIVE_ALWAYS;3738APICallback->LaunchManual = RSDK.GetAPIFunction("LaunchManual");39APICallback->ExitGame = RSDK.GetAPIFunction("ExitGame");40APICallback->ClearAchievements = RSDK.GetAPIFunction("ClearAchievements");41APICallback->UnlockAchievement = RSDK.GetAPIFunction("UnlockAchievement");42APICallback->SetRichPresence = RSDK.GetAPIFunction("SetRichPresence");43APICallback->FetchLeaderboard = RSDK.GetAPIFunction("FetchLeaderboard");44APICallback->LeaderboardStatus = RSDK.GetAPIFunction("LeaderboardStatus");45APICallback->LeaderboardEntryCount = RSDK.GetAPIFunction("LeaderboardEntryCount");46APICallback->LeaderboardReadEntry = RSDK.GetAPIFunction("LeaderboardReadEntry");47APICallback->TrackActClear = RSDK.GetAPIFunction("TrackActClear");48APICallback->TrackTAClear = RSDK.GetAPIFunction("TrackTAClear");49APICallback->TrackEnemyDefeat = RSDK.GetAPIFunction("TrackEnemyDefeat");50APICallback->TrackGameProgress = RSDK.GetAPIFunction("TrackGameProgress");51APICallback->ClearPrerollErrors = RSDK.GetAPIFunction("ClearPrerollErrors");52APICallback->TryAuth = RSDK.GetAPIFunction("TryAuth");53APICallback->GetUserAuthStatus = RSDK.GetAPIFunction("GetUserAuthStatus");54APICallback->GetUsername = RSDK.GetAPIFunction("GetUsername");55APICallback->TryInitStorage = RSDK.GetAPIFunction("TryInitStorage");56APICallback->GetStorageStatus = RSDK.GetAPIFunction("GetStorageStatus");57APICallback->LoadUserFile = RSDK.GetAPIFunction("LoadUserFile");58APICallback->SaveUserFile = RSDK.GetAPIFunction("SaveUserFile");59APICallback->SaveSettingsINI = RSDK.GetAPIFunction("SaveSettingsINI");60APICallback->GetUserLanguage = RSDK.GetAPIFunction("GetUserLanguage");61APICallback->GetConfirmButtonFlip = RSDK.GetAPIFunction("GetConfirmButtonFlip");62APICallback->ControllerIDForInputID = RSDK.GetAPIFunction("ControllerIDForInputID");63APICallback->MostRecentActiveControllerID = RSDK.GetAPIFunction("MostRecentActiveControllerID");64APICallback->AssignControllerID = RSDK.GetAPIFunction("AssignControllerID");65APICallback->ResetControllerAssignments = RSDK.GetAPIFunction("ResetControllerAssignments");66APICallback->InputIDIsDisconnected = RSDK.GetAPIFunction("InputIDIsDisconnected");67APICallback->GetInputType = RSDK.GetAPIFunction("GetInputType");68APICallback->GetControllerType = RSDK.GetAPIFunction("GetControllerType");69APICallback->ShowSteamControllerOverlay = RSDK.GetAPIFunction("ShowSteamControllerOverlay");7071APICallback->inputSlots[0] = CONT_P1;72APICallback->inputSlots[1] = CONT_P2;73APICallback->inputSlots[2] = CONT_P3;74APICallback->inputSlots[3] = CONT_P4;75APICallback->controllerCount = 4;76}7778void APICallback_SetRichPresence(int32 id, String *msg)79{80if (globals->presenceID != id) {81char buffer[0x40];82RSDK.GetCString(buffer, msg);8384if (APICallback->SetRichPresence) {85LogHelpers_Print("API SetRichPresence(%d)", id);86LogHelpers_Print("%s", buffer);8788APICallback->SetRichPresence(id, msg);89}90else {91LogHelpers_Print("EMPTY SetRichPresence(%d)", id);92LogHelpers_Print("%s", buffer);93}94}95}9697int32 APICallback_GetUserLanguage(void)98{99if (APICallback->GetUserLanguage) {100return APICallback->GetUserLanguage();101}102else {103LogHelpers_Print("EMPTY GetUserLanguage() -> GameInfo->language (%d)", sku_language);104return sku_language;105}106}107108bool32 APICallback_GetConfirmButtonFlip(void)109{110if (APICallback->GetConfirmButtonFlip)111return APICallback->GetConfirmButtonFlip();112113// LogHelpers_Print("DUMMY GetConfirmButtonFlip()");114return false;115}116117void APICallback_SetNoSaveEnabled(void)118{119APICallback->saveStatus = STATUS_ERROR;120globals->noSave = true;121}122123void APICallback_SetNoSaveDisabled(void)124{125APICallback->saveStatus = STATUS_FORBIDDEN;126globals->noSave = false;127}128129void APICallback_SaveUserFile(const char *name, void *buffer, int32 size, void (*callback)(int32))130{131if (API_GetNoSave()) {132LogHelpers_Print("SaveUserFile(%s, %X, %d, %X) failing due to noSave", name, buffer, size, callback);133callback(false);134}135else if (APICallback->SaveUserFile) {136LogHelpers_Print("API SaveUserFile(%s, %X, %d, %X)", name, buffer, size, callback);137APICallback->SaveUserFile(name, buffer, size, callback);138}139else {140LogHelpers_Print("DUMMY SaveUserFile(%s, %X, %d)", name, buffer, size);141EntityAPICallback *entity = CREATE_ENTITY(APICallback, APICallback_HandleCallback, 0, 0);142entity->callback = APICallback_SaveCB;143entity->timer = 30;144entity->fileSize = size;145entity->fileName = name;146entity->fileBuffer = buffer;147entity->fileCallback = callback;148}149}150151void APICallback_SaveCB(void)152{153RSDK_THIS(APICallback);154155int32 saveResult = RSDK.SaveUserFile(self->fileName, self->fileBuffer, self->fileSize);156LogHelpers_Print("DUMMY DummySaveCB(%s, %x, %d) -> %d", self->fileName, self->fileBuffer, self->fileSize, saveResult);157158if (self->fileCallback)159self->fileCallback(true);160}161162void APICallback_SaveSettingsINI(void)163{164if (APICallback->SetRichPresence) {165LogHelpers_Print("API SaveSettingsINI(%d)");166APICallback->SaveSettingsINI();167}168else {169LogHelpers_Print("EMPTY SaveSettingsINI()");170}171}172173LeaderboardEntry *APICallback_ReadLeaderboardEntry(int32 rankID)174{175if (APICallback->LeaderboardReadEntry)176return APICallback->LeaderboardReadEntry(rankID);177178if (!sku_platform) {179LogHelpers_Print("EMPTY LeaderboardReadEntry()");180return NULL;181}182183LogHelpers_Print("DUMMY LeaderboardReadEntry()");184185if (APICallback->leaderboardsStatus != STATUS_OK || rankID < 0 || rankID >= APICallback->leaderboardEntryCount) {186LogHelpers_Print("ERROR index out of bounds for RankEntry");187return NULL;188}189190const char *dummyNames[] = { "ORCIHILLARY124", "AUCTORJOLIE521", "SENECTUSFLORENCE789", "MAGNAAVRAM503", "SITVERNON320",191"DUICHRISTEN429", "NULLAKERMIT649", "INTEGERGEORGE708", "HENDRERITDREW443", "UTULYSSES507",192"ACCUMSANBRUCE276", "BANANAARON804", "MAURISSILAS372", "ETCALVIN641", "UTGALENA780",193"FEUGIATSHAY665", "ORCIJULIET388", "ETJENNA318", "LIBEROIDOLA420", "ATVIELKA576",194"PHASELLUSJENETTE627", "CONSECTETUERCALEB550", "SITVICTOR359", "PURUSDARRYL50", "DONECAVRAM56",195"PENATIBUSSYBILL30", "MAURISBARCLAY563", "CONGUECOLLEEN811", "MORBIDESTINY655", "SEMPERIONA579",196"RISUSKEANE807", "QUISQUEMARYAM927", "COMMODOSTEPHANIE54", "MALESUADABURTON350", "VIVAMUSROBIN330",197"QUISQUEWHILEMINA413", "VESTIBULUMRYDER890", "LACUSINDIRA112", "NEQUEJESCIE446", "EGESTASMORGAN390",198"ETODYSSEUS95", "EGETHERMIONE127", "ENIMPASCALE599", "ODIOWHOOPI328", "DOLORANGELICA718",199"ODIOSLOANE426", "DUIZELDA319", "METUSPORTER906", "NONUMMYSHANNON166", "IPSUMANTHONY906",200"ACCUMSANRAPHAEL296", "ORNAREHU604", "MOLESTIERYDER304", "FACILISILAITH900", "MIYVONNE287",201"CRASHEDY110", "TEMPUSRAE486", "ORCICOLBY173", "ULTRICESJADEN480", "LECTUSBEAU552",202"LIGULAJESSAMINE824", "ORCISOLOMON19", "VARIUSDARRYL437", "EUISMODKATELL668", "LACUSSTEVEN302",203"ALIQUETRICHARD807", "PEDEKAI692", "VIVAMUSCHARLOTTE167", "MAURISLEWIS101", "NULLANELLE11",204"MAECENASKAMEKO602", "LOREMHALEY545", "PHASELLUSPAUL954", "ERATGLORIA527", "DIAMBURKE290",205"SEMYOKO792", "ANTEMICHELLE769", "SEMPERDOMINIC873", "CONDIMENTUMNYSSA826", "PEDEDYLAN675",206"ETCRUZ380", "VELJAQUELYN95", "NONDACEY190", "UTCAIN386", "NULLANOMLANGA941",207"QUISQUESIERRA659", "MATTISABDUL346", "PHASELLUSKNOX183", "NEQUEXYLA92", "ORNAREGAY372",208"FACILISISIVY303", "TELLUSHARLAN339", "METUSSOPOLINE75", "NUNCKYLYNN927", "PROINHERMIONE775",209"TEMPORFITZGERALD656", "VELVELMA504", "FAUCIBUSTAMEKAH272", "PORTTITORWHOOPI881", "EUPETER41" };210211APICallback->leaderboardEntry.globalRank = rankID + (APICallback->rankScore + 1);212APICallback->leaderboardEntry.score = (4 * APICallback->leaderboardEntry.globalRank + 2400) % 59999;213APICallback->leaderboardEntry.isUser = APICallback->prevIsUser && rankID == APICallback->prevRank;214if (APICallback->leaderboardEntry.isUser) {215RSDK.InitString(&APICallback->leaderboardEntry.username, "YOU", 0);216LogHelpers_Print("RSDKRankEntry { globalRank: %d, score: %d, entryName: %s, isUser: %d }", APICallback->leaderboardEntry.globalRank,217APICallback->leaderboardEntry.score, "YOU", APICallback->leaderboardEntry.isUser);218}219else {220RSDK.InitString(&APICallback->leaderboardEntry.username, "", 0);221RSDK.SetString(&APICallback->leaderboardEntry.username, dummyNames[rankID]);222LogHelpers_Print("RSDKRankEntry { globalRank: %d, score: %d, entryName: %s, isUser: %d }", APICallback->leaderboardEntry.globalRank,223APICallback->leaderboardEntry.score, dummyNames[rankID], APICallback->leaderboardEntry.isUser);224}225return &APICallback->leaderboardEntry;226}227228void APICallback_NotifyAutoSave_OK(void)229{230APICallback->isAutoSaving = false;231globals->notifiedAutosave = true;232UIWaitSpinner_FinishWait();233}234235void APICallback_NotifyAutoSave_CB(void)236{237RSDK_THIS(APICallback);238239if (APICallback->isAutoSaving) {240if (!UIDialog->activeDialog) {241String string;242Localization_GetString(&string, STR_AUTOSAVENOTIF);243EntityUIDialog *dialog = UIDialog_CreateDialogOk(&string, APICallback_NotifyAutoSave_OK, true);244dialog->useAltColor = true;245}246}247else {248APICallback->activeEntity = NULL;249destroyEntity(self);250}251}252253void APICallback_PromptSavePreference_CB(void)254{255RSDK_THIS(APICallback);256257if (APICallback->saveStatus == STATUS_CONTINUE) {258if (!UIDialog->activeDialog) {259String string;260261int32 stringID = STR_SAVELOADFAIL;262switch (self->status) {263case STATUS_ERROR:264stringID = STR_NOXBOXPROFILE;265if (sku_platform != PLATFORM_XB1)266stringID = STR_SAVELOADFAIL;267break;268case STATUS_CORRUPT: stringID = STR_CORRUPTSAVE; break;269case STATUS_NOSPACE: stringID = (sku_platform == PLATFORM_XB1) + STR_NOSAVESPACE; break;270}271Localization_GetString(&string, stringID);272273EntityUIDialog *dialog = UIDialog_CreateDialogYesNo(&string, APICallback_SetNoSaveEnabled, APICallback_SetNoSaveDisabled, true, true);274dialog->useAltColor = true;275}276}277else {278APICallback->activeEntity = NULL;279destroyEntity(self);280}281}282283void APICallback_PromptSavePreference(int32 status)284{285if (API_GetNoSave()) {286LogHelpers_Print("PromptSavePreference() returning due to noSave");287return;288}289290LogHelpers_Print("PromptSavePreference()");291292if (APICallback->saveStatus == STATUS_CONTINUE)293LogHelpers_Print("WARNING PromptSavePreference() when prompt already in progress.");294295APICallback->saveStatus = STATUS_CONTINUE;296297EntityAPICallback *entity = CREATE_ENTITY(APICallback, APICallback_PromptSavePreference_CB, 0, 0);298entity->status = status;299APICallback->activeEntity = (Entity *)entity;300}301302void APICallback_LoadUserFile(const char *name, void *buffer, int32 size, void (*callback)(int32))303{304if (API_GetNoSave()) {305LogHelpers_Print("LoadUserFile(%s, %X, %d, %X) loading 0's due to noSave", name, buffer, size, callback);306memset(buffer, 0, size);307callback(false);308}309else if (APICallback->LoadUserFile) {310LogHelpers_Print("API LoadUserFile(%s, %X, %d, %X)", name, buffer, size, callback);311APICallback->LoadUserFile(name, buffer, size, callback);312}313else {314LogHelpers_Print("DUMMY LoadUserFile(%s, %X, %d)", name, buffer, size);315EntityAPICallback *entity = CREATE_ENTITY(APICallback, APICallback_HandleCallback, 0, 0);316entity->callback = APICallback_LoadCB;317entity->timer = 60;318entity->fileSize = size;319entity->fileName = name;320entity->fileBuffer = buffer;321entity->fileCallback = callback;322}323}324325void APICallback_LoadCB(void)326{327RSDK_THIS(APICallback);328329int32 loadResult = RSDK.LoadUserFile(self->fileName, self->fileBuffer, self->fileSize);330LogHelpers_Print("DUMMY DummyLoadCB(%s, %x, %d) -> %d", self->fileName, self->fileBuffer, self->fileSize, loadResult);331332if (self->fileCallback)333self->fileCallback(true);334}335336int32 APICallback_LeaderboardStatus(void)337{338if (APICallback->LeaderboardStatus)339return APICallback->LeaderboardStatus();340341int32 status = 0;342if (sku_platform < PLATFORM_PS4) {343LogHelpers_Print("EMPTY LeaderboardStatus()");344status = 0;345}346else {347LogHelpers_Print("DUMMY LeaderboardStatus()");348349if (APICallback->leaderboardsStatus == STATUS_CONTINUE) {350if (APICallback->statusTimer < 60) {351APICallback->statusTimer++;352return APICallback->leaderboardsStatus;353}354355if ((RSDK.Rand(0, 100) % 10) > 10)356APICallback->leaderboardsStatus = STATUS_ERROR;357else358APICallback->leaderboardsStatus = STATUS_OK;359}360status = APICallback->leaderboardsStatus;361}362363return status;364}365366int32 APICallback_LeaderboardEntryCount(void)367{368if (APICallback->LeaderboardEntryCount)369return APICallback->LeaderboardEntryCount();370371if (sku_platform < PLATFORM_PS4) {372LogHelpers_Print("EMPTY LeaderboardEntryCount()");373}374else {375LogHelpers_Print("DUMMY LeaderboardEntryCount()");376if (APICallback->leaderboardsStatus == STATUS_OK)377return APICallback->leaderboardEntryCount;378}379380return -1;381}382383void APICallback_LaunchManual()384{385if (APICallback->LaunchManual)386APICallback->LaunchManual();387else if (sku_platform == PLATFORM_DEV)388LogHelpers_Print("DUMMY LaunchManual()");389else390LogHelpers_Print("EMPTY LaunchManual()");391}392393void APICallback_HandleCallback(void)394{395RSDK_THIS(APICallback);396397if (self->timer <= 0) {398LogHelpers_Print("Callback: %x", self->callback);399StateMachine_Run(self->callback);400destroyEntity(self);401}402else {403self->timer--;404}405}406407int32 APICallback_GetUserAuthStatus(void)408{409if (APICallback->GetUserAuthStatus)410APICallback->authStatus = APICallback->GetUserAuthStatus();411else412APICallback->authStatus = STATUS_OK;413414if (APICallback->saveStatus || APICallback->authStatus != STATUS_ERROR) {415if (APICallback->authStatus == STATUS_FORBIDDEN && !APICallback->authForbidden) {416EntityAPICallback *entity = CREATE_ENTITY(APICallback, APICallback_CheckUserAuth_CB, 0, 0);417entity->active = ACTIVE_ALWAYS;418APICallback->activeEntity = (Entity *)entity;419APICallback->authForbidden = true;420}421}422else {423APICallback->saveStatus = STATUS_ERROR;424}425426return APICallback->authStatus;427}428429int32 APICallback_GetStorageStatus(void)430{431if (APICallback->saveStatus == STATUS_ERROR)432return STATUS_ERROR;433434int32 status = 0;435if (APICallback->GetStorageStatus) {436status = APICallback->GetStorageStatus(0);437}438else { // normally this is "if sku_platform != PLATFORM_PC" but we don't have a get storage status so lets pretend that check doesn't exist439if (APICallback->activeEntity) {440status = STATUS_CONTINUE;441}442else {443if (APICallback->storageStatus == STATUS_CONTINUE) {444if (APICallback->statusTimer >= 0) {445if (RSDK.Rand(0, 100) % 10 > 10)446APICallback->storageStatus = STATUS_ERROR;447else448APICallback->storageStatus = STATUS_OK;449}450else {451APICallback->statusTimer++;452}453}454status = APICallback->storageStatus;455}456}457458if (!APICallback->saveStatus) {459if (status == STATUS_ERROR) {460APICallback->saveStatus = STATUS_ERROR;461return STATUS_ERROR;462}463if (status == STATUS_OK)464APICallback->saveStatus = STATUS_OK;465}466467return status;468}469470int32 APICallback_GetSaveStatus(void)471{472if (API_GetNoSave())473return STATUS_OK;474475if (APICallback->activeEntity)476return STATUS_CONTINUE;477else478return APICallback->saveStatus;479}480481int32 APICallback_GetControllerType(int32 deviceID)482{483if (APICallback->GetControllerType)484return APICallback->GetControllerType(deviceID);485else486return sku_platform == PLATFORM_DEV;487}488489int32 APICallback_FetchLeaderboardData(uint8 zoneID, uint8 actID, int32 playerID, int32 start, int32 end, bool32 isUser)490{491if (APICallback->FetchLeaderboard)492return APICallback->FetchLeaderboard(zoneID, actID, playerID, start, end, isUser);493494if (sku_platform < PLATFORM_PS4) {495LogHelpers_Print("EMPTY FetchLeaderboardData(%d, %d, %d, %d, %d, %d)", zoneID, actID, playerID, start, end, isUser);496return 0;497}498499LogHelpers_Print("DUMMY FetchLeaderboardData(%d, %d, %d, %d, %d, %d)", zoneID, actID, playerID, start, end, isUser);500if (APICallback->leaderboardsStatus == STATUS_CONTINUE) {501LogHelpers_Print("WARNING Called FetchLeaderboard() while loading");502return 0;503}504505APICallback->rankScore = 0;506APICallback->leaderboardEntryCount = RSDK.Rand(start, end);507APICallback->prevIsUser = isUser;508if (isUser) {509APICallback->rankScore = RSDK.Rand(1000, 9999);510APICallback->prevRank = RSDK.Rand(0, APICallback->leaderboardEntryCount - 1);511}512APICallback->leaderboardsStatus = STATUS_CONTINUE;513APICallback->statusTimer = 0;514return 0;515}516517void APICallback_ExitGame(void)518{519if (APICallback->ExitGame) {520APICallback->ExitGame();521}522else {523if (sku_platform == PLATFORM_DEV)524exit(0);525526LogHelpers_Print("EMPTY ExitGame()");527}528}529530void APICallback_ClearPrerollErrors(void)531{532if (APICallback->ClearPrerollErrors) {533LogHelpers_Print("API ClearPrerollErrors()");534APICallback->ClearPrerollErrors();535}536else {537LogHelpers_Print("DUMMY ClearPrerollErrors()");538539if (APICallback->authStatus != STATUS_OK) {540APICallback->authStatus = STATUS_NONE;541}542if (APICallback->storageStatus != STATUS_OK)543APICallback->storageStatus = STATUS_NONE;544}545}546547bool32 APICallback_CheckInputDisconnected(void)548{549RSDK_THIS(APICallback);550551return APICallback_InputIDIsDisconnected(self->deviceID) || PauseMenu->forcedDisconnect;552}553554bool32 APICallback_InputIDIsDisconnected(uint8 inputSlot)555{556if (APICallback->InputIDIsDisconnected) {557return APICallback->InputIDIsDisconnected(inputSlot);558}559else {560LogHelpers_Print("DUMMY InputIDIsDisconnected()");561return APICallback->inputSlots[inputSlot];562}563}564565int32 APICallback_ControllerIDForInputID(uint8 inputSlot)566{567if (APICallback->ControllerIDForInputID) {568return APICallback->ControllerIDForInputID(inputSlot);569}570else {571LogHelpers_Print("DUMMY ControllerIDForInputID()");572return 1;573}574}575int32 APICallback_MostRecentActiveControllerID(uint8 inputSlot)576{577if (APICallback->MostRecentActiveControllerID) {578return APICallback->MostRecentActiveControllerID(inputSlot);579}580else {581LogHelpers_Print("DUMMY MostRecentActiveControllerID()");582return 1;583}584}585void APICallback_AssignControllerID(uint8 inputSlot, int32 deviceID)586{587if (APICallback->AssignControllerID) {588APICallback->AssignControllerID(inputSlot, deviceID);589}590else {591LogHelpers_Print("DUMMY AssignControllerID()");592APICallback->inputSlots[inputSlot] = deviceID;593}594}595void APICallback_ResetControllerAssignments(void)596{597if (APICallback->ResetControllerAssignments) {598APICallback->ResetControllerAssignments();599}600else {601LogHelpers_Print("DUMMY ResetControllerAssignments()");602APICallback->inputSlots[0] = 0;603APICallback->inputSlots[1] = 0;604APICallback->inputSlots[2] = 0;605APICallback->inputSlots[3] = 0;606}607}608609void APICallback_TrackActClear(uint8 zoneID, uint8 actID, uint8 playerID, int32 time, int32 rings, int32 score)610{611if (APICallback->TrackActClear)612APICallback->TrackActClear(zoneID, actID, playerID, score, rings, time);613else614LogHelpers_Print("EMPTY TrackActClear(%d, %d, %d, %d, %d, %d)", zoneID, actID, playerID, score, rings, time);615}616void APICallback_TrackTAClear(uint8 zoneID, uint8 actID, uint8 playerID, int32 time)617{618if (APICallback->TrackTAClear)619APICallback->TrackTAClear(zoneID, actID, playerID, time);620else621LogHelpers_Print("EMPTY TrackTAClear(%d, %d, %d, %d)", zoneID, actID, playerID, time);622}623void APICallback_TrackEnemyDefeat(uint8 zoneID, uint8 actID, uint8 playerID, int32 x, int32 y)624{625if (APICallback->TrackEnemyDefeat)626APICallback->TrackEnemyDefeat(zoneID, actID, playerID, x, y);627else628LogHelpers_Print("EMPTY TrackEnemyDefeat(%d, %d, %d, %d, %d)", zoneID, actID, playerID, x, y);629}630631void APICallback_TrackGameProgress(float percent)632{633if (APICallback->TrackGameProgress)634APICallback->TrackGameProgress(percent);635else636LogHelpers_Print("EMPTY TrackGameProgress(%f)", percent);637}638639void APICallback_TryAuth_No(void)640{641APICallback->authStatus = STATUS_ERROR;642APICallback->saveStatus = STATUS_ERROR;643}644645void APICallback_TryAuth_Yes(void) { APICallback->authStatus = STATUS_OK; }646647void APICallback_TryAuth_CB(void)648{649RSDK_THIS(APICallback);650651if (APICallback->authStatus == STATUS_CONTINUE) {652if (!UIDialog->activeDialog) {653String string;654switch (sku_platform) {655case PLATFORM_PC:656#if MANIA_USE_EGS657Localization_GetString(&string, STR_LOADEGS);658#else659Localization_GetString(&string, STR_LOADSTEAM);660#endif661break;662case PLATFORM_PS4: Localization_GetString(&string, STR_LOADPSN); break;663case PLATFORM_XB1: Localization_GetString(&string, STR_LOADXBOX); break;664case PLATFORM_SWITCH: Localization_GetString(&string, STR_LOADNINTENDO); break;665}666667EntityUIDialog *dialog = UIDialog_CreateDialogYesNo(&string, APICallback_TryAuth_Yes, APICallback_TryAuth_No, true, true);668dialog->useAltColor = true;669}670}671else {672APICallback->activeEntity = NULL;673destroyEntity(self);674}675}676677int32 APICallback_TryAuth(void)678{679if (APICallback->TryAuth) {680LogHelpers_Print("API TryAuth()");681return APICallback->TryAuth();682}683else {684LogHelpers_Print("DUMMY TryAuth()");685if (APICallback->authStatus == STATUS_CONTINUE) {686LogHelpers_Print("WARNING TryAuth() when auth already in progress.");687}688APICallback->statusTimer = 0;689APICallback->authStatus = STATUS_CONTINUE;690CREATE_ENTITY(APICallback, APICallback_TryAuth_CB, 0, 0);691692return STATUS_CONTINUE;693}694}695696void APICallback_TryInitStorage(void)697{698if (APICallback->TryInitStorage) {699LogHelpers_Print("API TryInitStorage()");700APICallback->TryInitStorage();701}702else {703LogHelpers_Print("DUMMY TryInitStorage()");704if (APICallback->storageStatus == STATUS_CONTINUE) {705LogHelpers_Print("WARNING TryInitStorage() when init already in progress.");706}707APICallback->statusTimer = 0;708APICallback->storageStatus = STATUS_CONTINUE;709}710}711712bool32 APICallback_GetUsername(String *userName)713{714if (APICallback->GetUsername) {715LogHelpers_Print("API GetUsername()");716APICallback->GetUsername(userName);717return true;718}719else {720if (sku_platform == PLATFORM_DEV) {721LogHelpers_Print("DUMMY GetUsername()");722RSDK.InitString(userName, "IntegerGeorge802", 0);723return true;724}725else {726LogHelpers_Print("EMPTY GetUsername()");727}728}729730return false;731}732733void APICallback_ClearAchievements(void)734{735if (APICallback->ClearAchievements)736APICallback->ClearAchievements();737else if (sku_platform == PLATFORM_DEV)738LogHelpers_Print("DUMMY ClearAchievements()");739else740LogHelpers_Print("EMPTY ClearAchievements()");741}742743void APICallback_UnlockAchievement(const char *name)744{745// Silly Workaround746AchievementID id;747id.id = name;748749if (APICallback->achievementsDisabled)750LogHelpers_Print("SKIP UnlockAchievement(%s)", name);751else if (APICallback->UnlockAchievement)752APICallback->UnlockAchievement(&id);753else if (sku_platform == PLATFORM_DEV)754LogHelpers_Print("DUMMY UnlockAchievement(%s)", name);755else756LogHelpers_Print("EMPTY UnlockAchievement(%s)", name);757}758759void APICallback_CheckUserAuth_OK(void) { APICallback->signedOut = true; }760761void APICallback_CheckUserAuth_CB(void)762{763RSDK_THIS(APICallback);764765EntityUIDialog *dialog = UIDialog->activeDialog;766if (self->timer) {767if (APICallback->signedOut) {768if (!dialog) {769if (Zone) {770RSDK.SetScene("Presentation", "Title Screen");771Zone_StartFadeOut(10, 0x000000);772}773else if (MenuSetup) {774MenuSetup_StartReturnToTitle();775}776777APICallback->activeEntity = NULL;778destroyEntity(self);779}780}781else if (!dialog) {782String string;783Localization_GetString(&string, STR_SIGNOUTDETECTED);784dialog = UIDialog_CreateDialogOk(&string, APICallback_CheckUserAuth_OK, true);785dialog->useAltColor = true;786}787}788else {789if (dialog) {790UIDialog_CloseOnSel_HandleSelection(dialog, StateMachine_None);791}792else {793if (UIControl) {794if (UIControl_GetUIControl())795UIControl_SetInactiveMenu(UIControl_GetUIControl());796}797798RSDK.SetEngineState(ENGINESTATE_FROZEN);799Music_Stop();800self->timer = 1;801}802}803}804805void APICallback_TrackGameProgressCB(void) { UIWaitSpinner_FinishWait(); }806807void APICallback_GetNextNotif(void)808{809if (SceneInfo->inEditor || API_GetNoSave() || globals->saveLoaded != STATUS_OK) {810return;811}812else {813ProgressRAM *progress = GameProgress_GetProgressRAM();814progress->unreadNotifs[GameProgress_GetNextNotif()] = true;815}816}817818void APICallback_ManageNotifs(void)819{820RSDK_THIS(APICallback);821822if (GameProgress_CountUnreadNotifs()) {823String string;824INIT_STRING(string);825if (!UIDialog->activeDialog) {826int32 str = GameProgress_GetNotifStringID(GameProgress_GetNextNotif());827Localization_GetString(&string, str);828EntityUIDialog *dialog = UIDialog_CreateDialogOk(&string, APICallback_GetNextNotif, true);829dialog->playEventSfx = true;830dialog->useAltColor = true;831}832}833else {834APICallback->activeEntity = NULL;835UIWaitSpinner_StartWait();836GameProgress_TrackGameProgress(APICallback_TrackGameProgressCB);837destroyEntity(self);838}839}840841bool32 APICallback_CheckUnreadNotifs(void)842{843if (!GameProgress_CountUnreadNotifs())844return false;845846if (!APICallback->activeEntity)847APICallback->activeEntity = (Entity *)CREATE_ENTITY(APICallback, APICallback_ManageNotifs, 0, 0);848849return true;850}851852bool32 APICallback_NotifyAutosave(void)853{854if (globals->notifiedAutosave) {855if (!APICallback->isAutoSaving && !APICallback->activeEntity)856return false;857}858else if (!APICallback->isAutoSaving || !APICallback->activeEntity) {859UIWaitSpinner_StartWait();860APICallback->isAutoSaving = true;861globals->notifiedAutosave = false;862LogHelpers_Print("DUMMY NotifyAutosave()");863EntityAPICallback *dialogRunner = CREATE_ENTITY(APICallback, APICallback_NotifyAutoSave_CB, 0, 0);864dialogRunner->active = ACTIVE_ALWAYS;865APICallback->activeEntity = (Entity *)dialogRunner;866}867868return true;869}870871#if GAME_INCLUDE_EDITOR872void APICallback_EditorDraw(void) {}873874void APICallback_EditorLoad(void) {}875#endif876877void APICallback_Serialize(void) {}878879#endif880881882