Path: blob/master/SonicMania/Objects/Helpers/GameProgress.h
338 views
#ifndef OBJ_GAMEPROGRESS_H1#define OBJ_GAMEPROGRESS_H23#include "Game.h"45#define GAMEPROGRESS_MEDAL_COUNT (32)6#define GAMEPROGRESS_ZONE_COUNT (12)7#define GAMEPROGRESS_EMERALD_COUNT (7)89typedef enum {10GAMEPROGRESS_UNLOCK_TIMEATTACK,11GAMEPROGRESS_UNLOCK_COMPETITION,12GAMEPROGRESS_UNLOCK_PEELOUT,13GAMEPROGRESS_UNLOCK_INSTASHIELD,14GAMEPROGRESS_UNLOCK_ANDKNUX,15GAMEPROGRESS_UNLOCK_DEBUGMODE,16GAMEPROGRESS_UNLOCK_MEANBEAN,17GAMEPROGRESS_UNLOCK_DAGARDEN,18GAMEPROGRESS_UNLOCK_BLUESPHERES,19GAMEPROGRESS_UNLOCK_COUNT,20} GameProgressUnlockIDs;2122typedef enum {23GAMEPROGRESS_ENDING_NONE,24GAMEPROGRESS_ENDING_BAD,25GAMEPROGRESS_ENDING_GOOD,26} GameProgressEndingIDs;2728typedef enum {29GAMEPROGRESS_MEDAL_NONE,30GAMEPROGRESS_MEDAL_SILVER,31GAMEPROGRESS_MEDAL_GOLD,32} GameProgressMedalIDs;3334typedef enum {35ACH_GOLD_MEDAL,36ACH_SILVER_MEDAL,37ACH_EMERALDS,38ACH_GAME_CLEARED,39ACH_STARPOST,40ACH_SIGNPOST,41ACH_GHZ,42ACH_CPZ,43ACH_SPZ,44ACH_FBZ,45ACH_PGZ,46ACH_SSZ,47ACH_HCZ,48ACH_MSZ,49ACH_OOZ,50ACH_LRZ,51ACH_MMZ,52ACH_TMZ,53} AchievementIDs;5455extern AchievementID achievementList[];5657// Using a seperate ProgressRAM struct58// Normally (and officially) the ObjectGameProgress struct was used here59// but due to v5U updating the entity (and thus the ProgressRAM "spec")60// ObjectGameProgress is no longer easily compatible across versions61// so I gave it dummy data and will be using this struct to interact with progressRAM62// this one was also broken with plus since medals[] were aligned by 1 byte63// so when "filter" was added, all medals were offset by 1 without this fix64typedef struct {65uint8 padding[0x56]; // aka sizeof(Entity) for pre-plus6667uint8 medals[GAMEPROGRESS_MEDAL_COUNT];68bool32 allGoldMedals;69bool32 allSilverMedals;70bool32 zoneCleared[GAMEPROGRESS_ZONE_COUNT];71bool32 allZonesCleared;72bool32 emeraldObtained[GAMEPROGRESS_EMERALD_COUNT];73bool32 allEmeraldsObtained;74bool32 unreadNotifs[GAMEPROGRESS_UNLOCK_COUNT];75bool32 specialCleared[GAMEPROGRESS_EMERALD_COUNT];76bool32 allSpecialCleared;77bool32 unlockedEndingID;78int32 goldMedalCount;79int32 silverMedalCount;80} ProgressRAM;8182// Object Class83struct ObjectGameProgress {84RSDK_OBJECT85};8687// Entity Class88struct EntityGameProgress {89RSDK_ENTITY90// padding to match whatever it would be normally91// not required, but its for safety :)92uint8 padding[sizeof(ProgressRAM) - sizeof(Entity)];93};9495// Object Struct96extern ObjectGameProgress *GameProgress;9798// Standard Entity Events99void GameProgress_Update(void);100void GameProgress_LateUpdate(void);101void GameProgress_StaticUpdate(void);102void GameProgress_Draw(void);103void GameProgress_Create(void *data);104void GameProgress_StageLoad(void);105#if GAME_INCLUDE_EDITOR106void GameProgress_EditorDraw(void);107void GameProgress_EditorLoad(void);108#endif109void GameProgress_Serialize(void);110111// Extra Entity Events112int32 GameProgress_GetNotifStringID(int32 type);113void GameProgress_ShuffleBSSID(void);114ProgressRAM *GameProgress_GetProgressRAM(void);115bool32 GameProgress_GetZoneUnlocked(int32 zoneID);116float GameProgress_GetCompletionPercent(ProgressRAM *progress);117#if MANIA_USE_PLUS118void GameProgress_TrackGameProgress(void (*callback)(bool32 success));119#else120void GameProgress_TrackGameProgress(void (*callback)(void));121#endif122void GameProgress_ClearBSSSave(void);123void GameProgress_UnlockAll(void);124void GameProgress_LockAllSpecialClear(void);125void GameProgress_ClearProgress(void);126void GameProgress_MarkZoneCompleted(int32 zoneID);127bool32 GameProgress_CheckZoneClear(void);128void GameProgress_GiveEmerald(int32 emeraldID);129void GameProgress_GiveMedal(uint8 medalID, uint8 type);130void GameProgress_GiveEnding(uint8 ending);131void GameProgress_PrintSaveProgress(void);132int32 GameProgress_CountUnreadNotifs(void);133int32 GameProgress_GetNextNotif(void);134bool32 GameProgress_CheckUnlock(uint8 id);135136#endif //! OBJ_GAMEPROGRESS_H137138139