Path: blob/master/SonicMania/Objects/Helpers/TimeAttackData.h
338 views
#ifndef OBJ_TIMEATTACKDATA_H1#define OBJ_TIMEATTACKDATA_H23#include "Game.h"45typedef enum {6CHAR_SONIC_AND_TAILS,7CHAR_SONIC,8CHAR_TAILS,9CHAR_KNUX,10#if MANIA_USE_PLUS11CHAR_MIGHTY,12CHAR_RAY,13#endif14} CharacterIDs;1516typedef enum {17ACT_1,18ACT_2,19ACT_3,20ACT_NONE,21} ActIDs;2223// Using a seperate TimeAttackRAM struct24// Normally (and officially) the ObjectGameProgress struct was used here25// but due to v5U updating the entity (and thus the TimeAttackRAM "spec")26// ObjectGameProgress is no longer easily compatible across versions27// so I gave it dummy data and will be using this struct to interact with TimeAttackRAM28// this one was also broken with plus since medals[] were aligned by 1 byte29// so when "filter" was added, all medals were offset by 1 without this fix30typedef struct {31uint8 padding[0x56]; // aka sizeof(Entity) for pre-plus32uint16 records[3][12][2][3];33} TimeAttackRAM;3435// Object Class36struct ObjectTimeAttackData {37#if !MANIA_USE_PLUS38RSDK_OBJECT39#endif40bool32 loaded;41uint8 zoneID;42uint8 act;43uint8 characterID;44bool32 encore;45int32 uuid;46int32 rowID;47int32 personalRank;48int32 leaderboardRank;49bool32 isMigratingData;50Entity *loadEntityPtr;51void (*loadCallback)(bool32 success);52Entity *saveEntityPtr;53void (*saveCallback)(bool32 success);54};5556#if !MANIA_USE_PLUS57// Entity Class58struct EntityTimeAttackData {59RSDK_ENTITY60// padding to match whatever it would be normally61// not required, but its for safety :)62uint8 padding[sizeof(TimeAttackRAM) - sizeof(Entity)];63};64#endif6566// Object Entity67extern ObjectTimeAttackData *TimeAttackData;6869// Standard Entity Events70void TimeAttackData_Update(void);71void TimeAttackData_LateUpdate(void);72void TimeAttackData_StaticUpdate(void);73void TimeAttackData_Draw(void);74void TimeAttackData_Create(void *data);75void TimeAttackData_StageLoad(void);76#if GAME_INCLUDE_EDITOR77void TimeAttackData_EditorDraw(void);78void TimeAttackData_EditorLoad(void);79#endif80void TimeAttackData_Serialize(void);8182// Extra Entity Functions83#if MANIA_USE_PLUS84void TimeAttackData_TrackActClear(StatInfo *stat, uint8 zone, uint8 act, uint8 charID, int32 time, int32 rings, int32 score);85void TimeAttackData_TrackTAClear(StatInfo *stat, uint8 zone, uint8 actID, uint8 charID, int32 gameMode, int32 time);86void TimeAttackData_TrackEnemyDefeat(StatInfo *stat, uint8 zoneID, uint8 actID, uint8 charID, bool32 encore, int32 x, int32 y);87#endif8889TimeAttackRAM *TimeAttackData_GetTimeAttackRAM(void);90void TimeAttackData_Clear(void);91int32 TimeAttackData_GetManiaListPos(int32 zoneID, int32 act, int32 characterID);92#if MANIA_USE_PLUS93int32 TimeAttackData_GetEncoreListPos(int32 zoneID, int32 act, int32 characterID);94#endif95uint32 TimeAttackData_GetPackedTime(int32 minutes, int32 seconds, int32 milliseconds);96void TimeAttackData_GetUnpackedTime(int32 time, int32 *minutes, int32 *seconds, int32 *milliseconds);97uint16 *TimeAttackData_GetRecordedTime(uint8 zoneID, uint8 act, uint8 characterID, uint8 rank);9899#if MANIA_USE_PLUS100void TimeAttackData_CreateDB(void);101uint16 TimeAttackData_LoadDB(void (*callback)(bool32 success));102void TimeAttackData_SaveDB(void (*callback)(bool32 success));103void TimeAttackData_LoadDBCallback(int32 status);104void TimeAttackData_SaveDBCallback(int32 status);105void TimeAttackData_MigrateLegacySaves(void);106int32 TimeAttackData_AddDBRow(uint8 zoneID, uint8 act, uint8 characterID, uint8 encore, int32 score);107int32 TimeAttackData_AddRecord(uint8 zoneID, uint8 act, uint8 characterID, bool32 encore, int32 score, void (*callback)(bool32 success));108int32 TimeAttackData_GetScore(uint8 zoneID, uint8 act, uint8 characterID, bool32 encore, int32 rank);109int32 TimeAttackData_GetReplayID(uint8 zoneID, uint8 act, uint8 characterID, bool32 encore, int32 rank);110void TimeAttackData_ConfigureTableView(uint8 zoneID, uint8 act, uint8 characterID, bool32 encore);111112void TimeAttackData_Leaderboard_GetRank(bool32 success, int32 rank);113void TimeAttackData_AddLeaderboardEntry(uint8 zoneID, uint8 act, uint8 characterID, bool32 isEncore, int32 score);114LeaderboardID *TimeAttackData_GetLeaderboardInfo(uint8 zoneID, uint8 act, uint8 characterID, bool32 isEncore);115#else116void TimeAttackData_AddRecord(uint8 zoneID, uint8 act, uint8 characterID, uint8 rank, uint16 score);117#endif118119#endif //! OBJ_TIMEATTACKDATA_H120121122