Path: blob/master/SonicMania/Objects/Helpers/TimeAttackData.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: TimeAttackData Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectTimeAttackData *TimeAttackData;1011#if MANIA_USE_PLUS12static const char *playerNames[] = { "Invalid", "Sonic", "Tails", "Knuckles", "Mighty", "Ray" };13static const char *actNames[] = { "Act 1", "Act 2", "Act 3", "" };14static const char *zoneNames[] = { "GHZ", "CPZ", "SPZ", "FBZ", "PGZ", "SSZ", "HCZ", "MSZ", "OOZ", "LRZ", "MMZ", "TMZ", "ERZ", "AIZ" };15static const char *modeNames[] = { "Mania", "Encore" };1617// clang-format off18static LeaderboardID leaderboardInfo[] = {19{ .idPS4 = 0, .idUnknown = 1, .idSwitch = 71, .idXbox = "PlusGHZ1SonicMania", .idPC = "GHZ1_S_MANIA" },20{ .idPS4 = 1, .idUnknown = 2, .idSwitch = 72, .idXbox = "PlusGHZ1TailsMania", .idPC = "GHZ1_T_MANIA" },21{ .idPS4 = 2, .idUnknown = 3, .idSwitch = 73, .idXbox = "PlusGHZ1KnucklesMania", .idPC = "GHZ1_K_MANIA" },22{ .idPS4 = 3, .idUnknown = 4, .idSwitch = 74, .idXbox = "PlusGHZ1MightyMania", .idPC = "GHZ1_M_MANIA" },23{ .idPS4 = 4, .idUnknown = 5, .idSwitch = 75, .idXbox = "PlusGHZ1RayMania", .idPC = "GHZ1_R_MANIA" },24{ .idPS4 = 5, .idUnknown = 6, .idSwitch = 76, .idXbox = "PlusGHZ2SonicMania", .idPC = "GHZ2_S_MANIA" },25{ .idPS4 = 6, .idUnknown = 7, .idSwitch = 77, .idXbox = "PlusGHZ2TailsMania", .idPC = "GHZ2_T_MANIA" },26{ .idPS4 = 7, .idUnknown = 8, .idSwitch = 78, .idXbox = "PlusGHZ2KnucklesMania", .idPC = "GHZ2_K_MANIA" },27{ .idPS4 = 8, .idUnknown = 9, .idSwitch = 79, .idXbox = "PlusGHZ2MightyMania", .idPC = "GHZ2_M_MANIA" },28{ .idPS4 = 9, .idUnknown = 10, .idSwitch = 80, .idXbox = "PlusGHZ2RayMania", .idPC = "GHZ2_R_MANIA" },29{ .idPS4 = 10, .idUnknown = 11, .idSwitch = 81, .idXbox = "PlusCPZ1SonicMania", .idPC = "CPZ1_S_MANIA" },30{ .idPS4 = 11, .idUnknown = 12, .idSwitch = 82, .idXbox = "PlusCPZ1TailsMania", .idPC = "CPZ1_T_MANIA" },31{ .idPS4 = 12, .idUnknown = 13, .idSwitch = 83, .idXbox = "PlusCPZ1KnucklesMania", .idPC = "CPZ1_K_MANIA" },32{ .idPS4 = 13, .idUnknown = 14, .idSwitch = 84, .idXbox = "PlusCPZ1MightyMania", .idPC = "CPZ1_M_MANIA" },33{ .idPS4 = 14, .idUnknown = 15, .idSwitch = 85, .idXbox = "PlusCPZ1RayMania", .idPC = "CPZ1_R_MANIA" },34{ .idPS4 = 15, .idUnknown = 16, .idSwitch = 86, .idXbox = "PlusCPZ2SonicMania", .idPC = "CPZ2_S_MANIA" },35{ .idPS4 = 16, .idUnknown = 17, .idSwitch = 87, .idXbox = "PlusCPZ2TailsMania", .idPC = "CPZ2_T_MANIA" },36{ .idPS4 = 17, .idUnknown = 18, .idSwitch = 88, .idXbox = "PlusCPZ2KnucklesMania", .idPC = "CPZ2_K_MANIA" },37{ .idPS4 = 18, .idUnknown = 19, .idSwitch = 89, .idXbox = "PlusCPZ2MightyMania", .idPC = "CPZ2_M_MANIA" },38{ .idPS4 = 19, .idUnknown = 20, .idSwitch = 90, .idXbox = "PlusCPZ2RayMania", .idPC = "CPZ2_R_MANIA" },39{ .idPS4 = 20, .idUnknown = 21, .idSwitch = 91, .idXbox = "PlusSPZ1SonicMania", .idPC = "SPZ1_S_MANIA" },40{ .idPS4 = 21, .idUnknown = 22, .idSwitch = 92, .idXbox = "PlusSPZ1TailsMania", .idPC = "SPZ1_T_MANIA" },41{ .idPS4 = 22, .idUnknown = 23, .idSwitch = 93, .idXbox = "PlusSPZ1KnucklesMania", .idPC = "SPZ1_K_MANIA" },42{ .idPS4 = 23, .idUnknown = 24, .idSwitch = 94, .idXbox = "PlusSPZ1MightyMania", .idPC = "SPZ1_M_MANIA" },43{ .idPS4 = 24, .idUnknown = 25, .idSwitch = 95, .idXbox = "PlusSPZ1RayMania", .idPC = "SPZ1_R_MANIA" },44{ .idPS4 = 25, .idUnknown = 26, .idSwitch = 96, .idXbox = "PlusSPZ2SonicMania", .idPC = "SPZ2_S_MANIA" },45{ .idPS4 = 26, .idUnknown = 27, .idSwitch = 97, .idXbox = "PlusSPZ2TailsMania", .idPC = "SPZ2_T_MANIA" },46{ .idPS4 = 27, .idUnknown = 28, .idSwitch = 98, .idXbox = "PlusSPZ2KnucklesMania", .idPC = "SPZ2_K_MANIA" },47{ .idPS4 = 28, .idUnknown = 29, .idSwitch = 99, .idXbox = "PlusSPZ2MightyMania", .idPC = "SPZ2_M_MANIA" },48{ .idPS4 = 29, .idUnknown = 30, .idSwitch = 100, .idXbox = "PlusSPZ2RayMania", .idPC = "SPZ2_R_MANIA" },49{ .idPS4 = 30, .idUnknown = 31, .idSwitch = 101, .idXbox = "PlusFBZ1SonicMania", .idPC = "FBZ1_S_MANIA" },50{ .idPS4 = 31, .idUnknown = 32, .idSwitch = 102, .idXbox = "PlusFBZ1TailsMania", .idPC = "FBZ1_T_MANIA" },51{ .idPS4 = 32, .idUnknown = 33, .idSwitch = 103, .idXbox = "PlusFBZ1KnucklesMania", .idPC = "FBZ1_K_MANIA" },52{ .idPS4 = 33, .idUnknown = 34, .idSwitch = 104, .idXbox = "PlusFBZ1MightyMania", .idPC = "FBZ1_M_MANIA" },53{ .idPS4 = 34, .idUnknown = 35, .idSwitch = 105, .idXbox = "PlusFBZ1RayMania", .idPC = "FBZ1_R_MANIA" },54{ .idPS4 = 35, .idUnknown = 36, .idSwitch = 106, .idXbox = "PlusFBZ2SonicMania", .idPC = "FBZ2_S_MANIA" },55{ .idPS4 = 36, .idUnknown = 37, .idSwitch = 107, .idXbox = "PlusFBZ2TailsMania", .idPC = "FBZ2_T_MANIA" },56{ .idPS4 = 37, .idUnknown = 38, .idSwitch = 108, .idXbox = "PlusFBZ2KnucklesMania", .idPC = "FBZ2_K_MANIA" },57{ .idPS4 = 38, .idUnknown = 39, .idSwitch = 109, .idXbox = "PlusFBZ2MightyMania", .idPC = "FBZ2_M_MANIA" },58{ .idPS4 = 39, .idUnknown = 40, .idSwitch = 110, .idXbox = "PlusFBZ2RayMania", .idPC = "FBZ2_R_MANIA" },59{ .idPS4 = 40, .idUnknown = 41, .idSwitch = 111, .idXbox = "PlusPGZ1SonicMania", .idPC = "PGZ1_S_MANIA" },60{ .idPS4 = 41, .idUnknown = 42, .idSwitch = 112, .idXbox = "PlusPGZ1TailsMania", .idPC = "PGZ1_T_MANIA" },61{ .idPS4 = 42, .idUnknown = 43, .idSwitch = 113, .idXbox = "PlusPGZ1KnucklesMania", .idPC = "PGZ1_K_MANIA" },62{ .idPS4 = 43, .idUnknown = 44, .idSwitch = 114, .idXbox = "PlusPGZ1MightyMania", .idPC = "PGZ1_M_MANIA" },63{ .idPS4 = 44, .idUnknown = 45, .idSwitch = 115, .idXbox = "PlusPGZ1RayMania", .idPC = "PGZ1_R_MANIA" },64{ .idPS4 = 45, .idUnknown = 46, .idSwitch = 116, .idXbox = "PlusPGZ2SonicMania", .idPC = "PGZ2_S_MANIA" },65{ .idPS4 = 46, .idUnknown = 47, .idSwitch = 117, .idXbox = "PlusPGZ2TailsMania", .idPC = "PGZ2_T_MANIA" },66{ .idPS4 = 47, .idUnknown = 48, .idSwitch = 118, .idXbox = "PlusPGZ2KnucklesMania", .idPC = "PGZ2_K_MANIA" },67{ .idPS4 = 48, .idUnknown = 49, .idSwitch = 119, .idXbox = "PlusPGZ2MightyMania", .idPC = "PGZ2_M_MANIA" },68{ .idPS4 = 49, .idUnknown = 50, .idSwitch = 120, .idXbox = "PlusPGZ2RayMania", .idPC = "PGZ2_R_MANIA" },69{ .idPS4 = 50, .idUnknown = 51, .idSwitch = 121, .idXbox = "PlusSSZ1SonicMania", .idPC = "SSZ1_S_MANIA" },70{ .idPS4 = 51, .idUnknown = 52, .idSwitch = 122, .idXbox = "PlusSSZ1TailsMania", .idPC = "SSZ1_T_MANIA" },71{ .idPS4 = 52, .idUnknown = 53, .idSwitch = 123, .idXbox = "PlusSSZ1KnucklesMania", .idPC = "SSZ1_K_MANIA" },72{ .idPS4 = 53, .idUnknown = 54, .idSwitch = 124, .idXbox = "PlusSSZ1MightyMania", .idPC = "SSZ1_M_MANIA" },73{ .idPS4 = 54, .idUnknown = 55, .idSwitch = 125, .idXbox = "PlusSSZ1RayMania", .idPC = "SSZ1_R_MANIA" },74{ .idPS4 = 55, .idUnknown = 56, .idSwitch = 126, .idXbox = "PlusSSZ2SonicMania", .idPC = "SSZ2_S_MANIA" },75{ .idPS4 = 56, .idUnknown = 57, .idSwitch = 127, .idXbox = "PlusSSZ2TailsMania", .idPC = "SSZ2_T_MANIA" },76{ .idPS4 = 57, .idUnknown = 58, .idSwitch = 128, .idXbox = "PlusSSZ2KnucklesMania", .idPC = "SSZ2_K_MANIA" },77{ .idPS4 = 58, .idUnknown = 59, .idSwitch = 129, .idXbox = "PlusSSZ2MightyMania", .idPC = "SSZ2_M_MANIA" },78{ .idPS4 = 59, .idUnknown = 60, .idSwitch = 130, .idXbox = "PlusSSZ2RayMania", .idPC = "SSZ2_R_MANIA" },79{ .idPS4 = 60, .idUnknown = 61, .idSwitch = 131, .idXbox = "PlusHCZ1SonicMania", .idPC = "HCZ1_S_MANIA" },80{ .idPS4 = 61, .idUnknown = 62, .idSwitch = 132, .idXbox = "PlusHCZ1TailsMania", .idPC = "HCZ1_T_MANIA" },81{ .idPS4 = 62, .idUnknown = 63, .idSwitch = 133, .idXbox = "PlusHCZ1KnucklesMania", .idPC = "HCZ1_K_MANIA" },82{ .idPS4 = 63, .idUnknown = 64, .idSwitch = 134, .idXbox = "PlusHCZ1MightyMania", .idPC = "HCZ1_M_MANIA" },83{ .idPS4 = 64, .idUnknown = 65, .idSwitch = 135, .idXbox = "PlusHCZ1RayMania", .idPC = "HCZ1_R_MANIA" },84{ .idPS4 = 65, .idUnknown = 66, .idSwitch = 136, .idXbox = "PlusHCZ2SonicMania", .idPC = "HCZ2_S_MANIA" },85{ .idPS4 = 66, .idUnknown = 67, .idSwitch = 137, .idXbox = "PlusHCZ2TailsMania", .idPC = "HCZ2_T_MANIA" },86{ .idPS4 = 67, .idUnknown = 68, .idSwitch = 138, .idXbox = "PlusHCZ2KnucklesMania", .idPC = "HCZ2_K_MANIA" },87{ .idPS4 = 68, .idUnknown = 69, .idSwitch = 139, .idXbox = "PlusHCZ2MightyMania", .idPC = "HCZ2_M_MANIA" },88{ .idPS4 = 69, .idUnknown = 70, .idSwitch = 140, .idXbox = "PlusHCZ2RayMania", .idPC = "HCZ2_R_MANIA" },89{ .idPS4 = -1, .idUnknown = -1, .idSwitch = -1, .idXbox = NULL, .idPC = NULL },90{ .idPS4 = -1, .idUnknown = -1, .idSwitch = -1, .idXbox = NULL, .idPC = NULL },91{ .idPS4 = 72, .idUnknown = 71, .idSwitch = 141, .idXbox = "PlusMSZ1KnucklesMania", .idPC = "MSZ1_K_MANIA" },92{ .idPS4 = -1, .idUnknown = -1, .idSwitch = -1, .idXbox = NULL, .idPC = NULL },93{ .idPS4 = -1, .idUnknown = -1, .idSwitch = -1, .idXbox = NULL, .idPC = NULL },94{ .idPS4 = 75, .idUnknown = 72, .idSwitch = 142, .idXbox = "PlusMSZ2SonicMania", .idPC = "MSZ2_S_MANIA" },95{ .idPS4 = 76, .idUnknown = 73, .idSwitch = 143, .idXbox = "PlusMSZ2TailsMania", .idPC = "MSZ2_T_MANIA" },96{ .idPS4 = 77, .idUnknown = 74, .idSwitch = 144, .idXbox = "PlusMSZ2KnucklesMania", .idPC = "MSZ2_K_MANIA" },97{ .idPS4 = 78, .idUnknown = 75, .idSwitch = 145, .idXbox = "PlusMSZ2MightyMania", .idPC = "MSZ2_M_MANIA" },98{ .idPS4 = 79, .idUnknown = 76, .idSwitch = 146, .idXbox = "PlusMSZ2RayMania", .idPC = "MSZ2_R_MANIA" },99{ .idPS4 = 80, .idUnknown = 77, .idSwitch = 147, .idXbox = "PlusOOZ1SonicMania", .idPC = "OOZ1_S_MANIA" },100{ .idPS4 = 81, .idUnknown = 78, .idSwitch = 148, .idXbox = "PlusOOZ1TailsMania", .idPC = "OOZ1_T_MANIA" },101{ .idPS4 = 82, .idUnknown = 79, .idSwitch = 149, .idXbox = "PlusOOZ1KnucklesMania", .idPC = "OOZ1_K_MANIA" },102{ .idPS4 = 83, .idUnknown = 80, .idSwitch = 150, .idXbox = "PlusOOZ1MightyMania", .idPC = "OOZ1_M_MANIA" },103{ .idPS4 = 84, .idUnknown = 81, .idSwitch = 151, .idXbox = "PlusOOZ1RayMania", .idPC = "OOZ1_R_MANIA" },104{ .idPS4 = 85, .idUnknown = 82, .idSwitch = 152, .idXbox = "PlusOOZ2SonicMania", .idPC = "OOZ2_S_MANIA" },105{ .idPS4 = 86, .idUnknown = 83, .idSwitch = 153, .idXbox = "PlusOOZ2TailsMania", .idPC = "OOZ2_T_MANIA" },106{ .idPS4 = 87, .idUnknown = 84, .idSwitch = 154, .idXbox = "PlusOOZ2KnucklesMania", .idPC = "OOZ2_K_MANIA" },107{ .idPS4 = 88, .idUnknown = 85, .idSwitch = 155, .idXbox = "PlusOOZ2MightyMania", .idPC = "OOZ2_M_MANIA" },108{ .idPS4 = 89, .idUnknown = 86, .idSwitch = 156, .idXbox = "PlusOOZ2RayMania", .idPC = "OOZ2_R_MANIA" },109{ .idPS4 = 90, .idUnknown = 87, .idSwitch = 157, .idXbox = "PlusLRZ1SonicMania", .idPC = "LRZ1_S_MANIA" },110{ .idPS4 = 91, .idUnknown = 88, .idSwitch = 158, .idXbox = "PlusLRZ1TailsMania", .idPC = "LRZ1_T_MANIA" },111{ .idPS4 = 92, .idUnknown = 89, .idSwitch = 159, .idXbox = "PlusLRZ1KnucklesMania", .idPC = "LRZ1_K_MANIA" },112{ .idPS4 = 93, .idUnknown = 90, .idSwitch = 160, .idXbox = "PlusLRZ1MightyMania", .idPC = "LRZ1_M_MANIA" },113{ .idPS4 = 94, .idUnknown = 91, .idSwitch = 161, .idXbox = "PlusLRZ1RayMania", .idPC = "LRZ1_R_MANIA" },114{ .idPS4 = 95, .idUnknown = 92, .idSwitch = 162, .idXbox = "PlusLRZ2SonicMania", .idPC = "LRZ2_S_MANIA" },115{ .idPS4 = 96, .idUnknown = 93, .idSwitch = 163, .idXbox = "PlusLRZ2TailsMania", .idPC = "LRZ2_T_MANIA" },116{ .idPS4 = 97, .idUnknown = 94, .idSwitch = 164, .idXbox = "PlusLRZ2KnucklesMania", .idPC = "LRZ2_K_MANIA" },117{ .idPS4 = 98, .idUnknown = 95, .idSwitch = 165, .idXbox = "PlusLRZ2MightyMania", .idPC = "LRZ2_M_MANIA" },118{ .idPS4 = 99, .idUnknown = 96, .idSwitch = 166, .idXbox = "PlusLRZ2RayMania", .idPC = "LRZ2_R_MANIA" },119{ .idPS4 = 100, .idUnknown = 97, .idSwitch = 167, .idXbox = "PlusMMZ1SonicMania", .idPC = "MMZ1_S_MANIA" },120{ .idPS4 = 101, .idUnknown = 98, .idSwitch = 168, .idXbox = "PlusMMZ1TailsMania", .idPC = "MMZ1_T_MANIA" },121{ .idPS4 = 102, .idUnknown = 99, .idSwitch = 169, .idXbox = "PlusMMZ1KnucklesMania", .idPC = "MMZ1_K_MANIA" },122{ .idPS4 = 103, .idUnknown = 100, .idSwitch = 170, .idXbox = "PlusMMZ1MightyMania", .idPC = "MMZ1_M_MANIA" },123{ .idPS4 = 104, .idUnknown = 101, .idSwitch = 171, .idXbox = "PlusMMZ1RayMania", .idPC = "MMZ1_R_MANIA" },124{ .idPS4 = 105, .idUnknown = 102, .idSwitch = 172, .idXbox = "PlusMMZ2SonicMania", .idPC = "MMZ2_S_MANIA" },125{ .idPS4 = 106, .idUnknown = 103, .idSwitch = 173, .idXbox = "PlusMMZ2TailsMania", .idPC = "MMZ2_T_MANIA" },126{ .idPS4 = 107, .idUnknown = 104, .idSwitch = 174, .idXbox = "PlusMMZ2KnucklesMania", .idPC = "MMZ2_K_MANIA" },127{ .idPS4 = 108, .idUnknown = 105, .idSwitch = 175, .idXbox = "PlusMMZ2MightyMania", .idPC = "MMZ2_M_MANIA" },128{ .idPS4 = 109, .idUnknown = 106, .idSwitch = 176, .idXbox = "PlusMMZ2RayMania", .idPC = "MMZ2_R_MANIA" },129{ .idPS4 = 110, .idUnknown = 107, .idSwitch = 177, .idXbox = "PlusTMZ1SonicMania", .idPC = "TMZ1_S_MANIA" },130{ .idPS4 = 111, .idUnknown = 108, .idSwitch = 178, .idXbox = "PlusTMZ1TailsMania", .idPC = "TMZ1_T_MANIA" },131{ .idPS4 = 112, .idUnknown = 109, .idSwitch = 179, .idXbox = "PlusTMZ1KnucklesMania", .idPC = "TMZ1_K_MANIA" },132{ .idPS4 = 113, .idUnknown = 110, .idSwitch = 180, .idXbox = "PlusTMZ1MightyMania", .idPC = "TMZ1_M_MANIA" },133{ .idPS4 = 114, .idUnknown = 111, .idSwitch = 181, .idXbox = "PlusTMZ1RayMania", .idPC = "TMZ1_R_MANIA" },134{ .idPS4 = 115, .idUnknown = 112, .idSwitch = 182, .idXbox = "PlusTMZ2SonicMania", .idPC = "TMZ2_S_MANIA" },135{ .idPS4 = 116, .idUnknown = 113, .idSwitch = 183, .idXbox = "PlusTMZ2TailsMania", .idPC = "TMZ2_T_MANIA" },136{ .idPS4 = 117, .idUnknown = 114, .idSwitch = 184, .idXbox = "PlusTMZ2KnucklesMania", .idPC = "TMZ2_K_MANIA" },137{ .idPS4 = 118, .idUnknown = 115, .idSwitch = 185, .idXbox = "PlusTMZ2MightyMania", .idPC = "TMZ2_M_MANIA" },138{ .idPS4 = 119, .idUnknown = 116, .idSwitch = 186, .idXbox = "PlusTMZ2RayMania", .idPC = "TMZ2_R_MANIA" },139140{ .idPS4 = 120, .idUnknown = 117, .idSwitch = 187, .idXbox = "PlusGHZ1SonicEncore", .idPC = "GHZ1_S_ENCORE" },141{ .idPS4 = 121, .idUnknown = 118, .idSwitch = 188, .idXbox = "PlusGHZ1TailsEncore", .idPC = "GHZ1_T_ENCORE" },142{ .idPS4 = 122, .idUnknown = 119, .idSwitch = 189, .idXbox = "PlusGHZ1KnucklesEncore", .idPC = "GHZ1_K_ENCORE" },143{ .idPS4 = 123, .idUnknown = 120, .idSwitch = 190, .idXbox = "PlusGHZ1MightyEncore", .idPC = "GHZ1_M_ENCORE" },144{ .idPS4 = 124, .idUnknown = 121, .idSwitch = 191, .idXbox = "PlusGHZ1RayEncore", .idPC = "GHZ1_R_ENCORE" },145{ .idPS4 = 125, .idUnknown = 122, .idSwitch = 192, .idXbox = "PlusGHZ2SonicEncore", .idPC = "GHZ2_S_ENCORE" },146{ .idPS4 = 126, .idUnknown = 123, .idSwitch = 193, .idXbox = "PlusGHZ2TailsEncore", .idPC = "GHZ2_T_ENCORE" },147{ .idPS4 = 127, .idUnknown = 124, .idSwitch = 194, .idXbox = "PlusGHZ2KnucklesEncore", .idPC = "GHZ2_K_ENCORE" },148{ .idPS4 = 128, .idUnknown = 125, .idSwitch = 195, .idXbox = "PlusGHZ2MightyEncore", .idPC = "GHZ2_M_ENCORE" },149{ .idPS4 = 129, .idUnknown = 126, .idSwitch = 196, .idXbox = "PlusGHZ2RayEncore", .idPC = "GHZ2_R_ENCORE" },150{ .idPS4 = 130, .idUnknown = 127, .idSwitch = 197, .idXbox = "PlusCPZ1SonicEncore", .idPC = "CPZ1_S_ENCORE" },151{ .idPS4 = 131, .idUnknown = 128, .idSwitch = 198, .idXbox = "PlusCPZ1TailsEncore", .idPC = "CPZ1_T_ENCORE" },152{ .idPS4 = 132, .idUnknown = 129, .idSwitch = 199, .idXbox = "PlusCPZ1KnucklesEncore", .idPC = "CPZ1_K_ENCORE" },153{ .idPS4 = 133, .idUnknown = 130, .idSwitch = 200, .idXbox = "PlusCPZ1MightyEncore", .idPC = "CPZ1_M_ENCORE" },154{ .idPS4 = 134, .idUnknown = 131, .idSwitch = 201, .idXbox = "PlusCPZ1RayEncore", .idPC = "CPZ1_R_ENCORE" },155{ .idPS4 = 135, .idUnknown = 132, .idSwitch = 202, .idXbox = "PlusCPZ2SonicEncore", .idPC = "CPZ2_S_ENCORE" },156{ .idPS4 = 136, .idUnknown = 133, .idSwitch = 203, .idXbox = "PlusCPZ2TailsEncore", .idPC = "CPZ2_T_ENCORE" },157{ .idPS4 = 137, .idUnknown = 134, .idSwitch = 204, .idXbox = "PlusCPZ2KnucklesEncore", .idPC = "CPZ2_K_ENCORE" },158{ .idPS4 = 138, .idUnknown = 135, .idSwitch = 205, .idXbox = "PlusCPZ2MightyEncore", .idPC = "CPZ2_M_ENCORE" },159{ .idPS4 = 139, .idUnknown = 136, .idSwitch = 206, .idXbox = "PlusCPZ2RayEncore", .idPC = "CPZ2_R_ENCORE" },160{ .idPS4 = 140, .idUnknown = 137, .idSwitch = 207, .idXbox = "PlusSPZ1SonicEncore", .idPC = "SPZ1_S_ENCORE" },161{ .idPS4 = 141, .idUnknown = 138, .idSwitch = 208, .idXbox = "PlusSPZ1TailsEncore", .idPC = "SPZ1_T_ENCORE" },162{ .idPS4 = 142, .idUnknown = 139, .idSwitch = 209, .idXbox = "PlusSPZ1KnucklesEncore", .idPC = "SPZ1_K_ENCORE" },163{ .idPS4 = 143, .idUnknown = 140, .idSwitch = 210, .idXbox = "PlusSPZ1MightyEncore", .idPC = "SPZ1_M_ENCORE" },164{ .idPS4 = 144, .idUnknown = 141, .idSwitch = 211, .idXbox = "PlusSPZ1RayEncore", .idPC = "SPZ1_R_ENCORE" },165{ .idPS4 = 145, .idUnknown = 142, .idSwitch = 212, .idXbox = "PlusSPZ2SonicEncore", .idPC = "SPZ2_S_ENCORE" },166{ .idPS4 = 146, .idUnknown = 143, .idSwitch = 213, .idXbox = "PlusSPZ2TailsEncore", .idPC = "SPZ2_T_ENCORE" },167{ .idPS4 = 147, .idUnknown = 144, .idSwitch = 214, .idXbox = "PlusSPZ2KnucklesEncore", .idPC = "SPZ2_K_ENCORE" },168{ .idPS4 = 148, .idUnknown = 145, .idSwitch = 215, .idXbox = "PlusSPZ2MightyEncore", .idPC = "SPZ2_M_ENCORE" },169{ .idPS4 = 149, .idUnknown = 146, .idSwitch = 216, .idXbox = "PlusSPZ2RayEncore", .idPC = "SPZ2_R_ENCORE" },170{ .idPS4 = 150, .idUnknown = 147, .idSwitch = 217, .idXbox = "PlusFBZ1SonicEncore", .idPC = "FBZ1_S_ENCORE" },171{ .idPS4 = 151, .idUnknown = 148, .idSwitch = 218, .idXbox = "PlusFBZ1TailsEncore", .idPC = "FBZ1_T_ENCORE" },172{ .idPS4 = 152, .idUnknown = 149, .idSwitch = 219, .idXbox = "PlusFBZ1KnucklesEncore", .idPC = "FBZ1_K_ENCORE" },173{ .idPS4 = 153, .idUnknown = 150, .idSwitch = 220, .idXbox = "PlusFBZ1MightyEncore", .idPC = "FBZ1_M_ENCORE" },174{ .idPS4 = 154, .idUnknown = 151, .idSwitch = 221, .idXbox = "PlusFBZ1RayEncore", .idPC = "FBZ1_R_ENCORE" },175{ .idPS4 = 155, .idUnknown = 152, .idSwitch = 222, .idXbox = "PlusFBZ2SonicEncore", .idPC = "FBZ2_S_ENCORE" },176{ .idPS4 = 156, .idUnknown = 153, .idSwitch = 223, .idXbox = "PlusFBZ2TailsEncore", .idPC = "FBZ2_T_ENCORE" },177{ .idPS4 = 157, .idUnknown = 154, .idSwitch = 224, .idXbox = "PlusFBZ2KnucklesEncore", .idPC = "FBZ2_K_ENCORE" },178{ .idPS4 = 158, .idUnknown = 155, .idSwitch = 225, .idXbox = "PlusFBZ2MightyEncore", .idPC = "FBZ2_M_ENCORE" },179{ .idPS4 = 159, .idUnknown = 156, .idSwitch = 226, .idXbox = "PlusFBZ2RayEncore", .idPC = "FBZ2_R_ENCORE" },180{ .idPS4 = 160, .idUnknown = 157, .idSwitch = 227, .idXbox = "PlusPGZ1SonicEncore", .idPC = "PGZ1_S_ENCORE" },181{ .idPS4 = 161, .idUnknown = 158, .idSwitch = 228, .idXbox = "PlusPGZ1TailsEncore", .idPC = "PGZ1_T_ENCORE" },182{ .idPS4 = 162, .idUnknown = 159, .idSwitch = 229, .idXbox = "PlusPGZ1KnucklesEncore", .idPC = "PGZ1_K_ENCORE" },183{ .idPS4 = 163, .idUnknown = 160, .idSwitch = 230, .idXbox = "PlusPGZ1MightyEncore", .idPC = "PGZ1_M_ENCORE" },184{ .idPS4 = 164, .idUnknown = 161, .idSwitch = 231, .idXbox = "PlusPGZ1RayEncore", .idPC = "PGZ1_R_ENCORE" },185{ .idPS4 = 165, .idUnknown = 162, .idSwitch = 232, .idXbox = "PlusPGZ2SonicEncore", .idPC = "PGZ2_S_ENCORE" },186{ .idPS4 = 166, .idUnknown = 163, .idSwitch = 233, .idXbox = "PlusPGZ2TailsEncore", .idPC = "PGZ2_T_ENCORE" },187{ .idPS4 = 167, .idUnknown = 164, .idSwitch = 234, .idXbox = "PlusPGZ2KnucklesEncore", .idPC = "PGZ2_K_ENCORE" },188{ .idPS4 = 168, .idUnknown = 165, .idSwitch = 235, .idXbox = "PlusPGZ2MightyEncore", .idPC = "PGZ2_M_ENCORE" },189{ .idPS4 = 169, .idUnknown = 166, .idSwitch = 236, .idXbox = "PlusPGZ2RayEncore", .idPC = "PGZ2_R_ENCORE" },190{ .idPS4 = 170, .idUnknown = 167, .idSwitch = 237, .idXbox = "PlusSSZ1SonicEncore", .idPC = "SSZ1_S_ENCORE" },191{ .idPS4 = 171, .idUnknown = 168, .idSwitch = 238, .idXbox = "PlusSSZ1TailsEncore", .idPC = "SSZ1_T_ENCORE" },192{ .idPS4 = 172, .idUnknown = 169, .idSwitch = 239, .idXbox = "PlusSSZ1KnucklesEncore", .idPC = "SSZ1_K_ENCORE" },193{ .idPS4 = 173, .idUnknown = 170, .idSwitch = 240, .idXbox = "PlusSSZ1MightyEncore", .idPC = "SSZ1_M_ENCORE" },194{ .idPS4 = 174, .idUnknown = 171, .idSwitch = 241, .idXbox = "PlusSSZ1RayEncore", .idPC = "SSZ1_R_ENCORE" },195{ .idPS4 = 175, .idUnknown = 172, .idSwitch = 242, .idXbox = "PlusSSZ2SonicEncore", .idPC = "SSZ2_S_ENCORE" },196{ .idPS4 = 176, .idUnknown = 173, .idSwitch = 243, .idXbox = "PlusSSZ2TailsEncore", .idPC = "SSZ2_T_ENCORE" },197{ .idPS4 = 177, .idUnknown = 174, .idSwitch = 244, .idXbox = "PlusSSZ2KnucklesEncore", .idPC = "SSZ2_K_ENCORE" },198{ .idPS4 = 178, .idUnknown = 175, .idSwitch = 245, .idXbox = "PlusSSZ2MightyEncore", .idPC = "SSZ2_M_ENCORE" },199{ .idPS4 = 179, .idUnknown = 176, .idSwitch = 246, .idXbox = "PlusSSZ2RayEncore", .idPC = "SSZ2_R_ENCORE" },200{ .idPS4 = 180, .idUnknown = 177, .idSwitch = 247, .idXbox = "PlusHCZ1SonicEncore", .idPC = "HCZ1_S_ENCORE" },201{ .idPS4 = 181, .idUnknown = 178, .idSwitch = 248, .idXbox = "PlusHCZ1TailsEncore", .idPC = "HCZ1_T_ENCORE" },202{ .idPS4 = 182, .idUnknown = 179, .idSwitch = 249, .idXbox = "PlusHCZ1KnucklesEncore", .idPC = "HCZ1_K_ENCORE" },203{ .idPS4 = 183, .idUnknown = 180, .idSwitch = 250, .idXbox = "PlusHCZ1MightyEncore", .idPC = "HCZ1_M_ENCORE" },204{ .idPS4 = 184, .idUnknown = 181, .idSwitch = 251, .idXbox = "PlusHCZ1RayEncore", .idPC = "HCZ1_R_ENCORE" },205{ .idPS4 = 185, .idUnknown = 182, .idSwitch = 252, .idXbox = "PlusHCZ2SonicEncore", .idPC = "HCZ2_S_ENCORE" },206{ .idPS4 = 186, .idUnknown = 183, .idSwitch = 253, .idXbox = "PlusHCZ2TailsEncore", .idPC = "HCZ2_T_ENCORE" },207{ .idPS4 = 187, .idUnknown = 184, .idSwitch = 254, .idXbox = "PlusHCZ2KnucklesEncore", .idPC = "HCZ2_K_ENCORE" },208{ .idPS4 = 188, .idUnknown = 185, .idSwitch = 255, .idXbox = "PlusHCZ2MightyEncore", .idPC = "HCZ2_M_ENCORE" },209{ .idPS4 = 189, .idUnknown = 186, .idSwitch = 256, .idXbox = "PlusHCZ2RayEncore", .idPC = "HCZ2_R_ENCORE" },210{ .idPS4 = 190, .idUnknown = 187, .idSwitch = 257, .idXbox = "PlusMSZ1SonicEncore", .idPC = "MSZ1_S_ENCORE" },211{ .idPS4 = 191, .idUnknown = 188, .idSwitch = 258, .idXbox = "PlusMSZ1TailsEncore", .idPC = "MSZ1_T_ENCORE" },212{ .idPS4 = 192, .idUnknown = 189, .idSwitch = 259, .idXbox = "PlusMSZ1KnucklesEncore", .idPC = "MSZ1_K_ENCORE" },213{ .idPS4 = 193, .idUnknown = 190, .idSwitch = 260, .idXbox = "PlusMSZ1MightyEncore", .idPC = "MSZ1_M_ENCORE" },214{ .idPS4 = 194, .idUnknown = 191, .idSwitch = 261, .idXbox = "PlusMSZ1RayEncore", .idPC = "MSZ1_R_ENCORE" },215{ .idPS4 = 195, .idUnknown = 192, .idSwitch = 262, .idXbox = "PlusMSZ2SonicEncore", .idPC = "MSZ2_S_ENCORE" },216{ .idPS4 = 196, .idUnknown = 193, .idSwitch = 263, .idXbox = "PlusMSZ2TailsEncore", .idPC = "MSZ2_T_ENCORE" },217{ .idPS4 = 197, .idUnknown = 194, .idSwitch = 264, .idXbox = "PlusMSZ2KnucklesEncore", .idPC = "MSZ2_K_ENCORE" },218{ .idPS4 = 198, .idUnknown = 195, .idSwitch = 265, .idXbox = "PlusMSZ2MightyEncore", .idPC = "MSZ2_M_ENCORE" },219{ .idPS4 = 199, .idUnknown = 196, .idSwitch = 266, .idXbox = "PlusMSZ2RayEncore", .idPC = "MSZ2_R_ENCORE" },220{ .idPS4 = 200, .idUnknown = 197, .idSwitch = 267, .idXbox = "PlusOOZ1SonicEncore", .idPC = "OOZ1_S_ENCORE" },221{ .idPS4 = 201, .idUnknown = 198, .idSwitch = 268, .idXbox = "PlusOOZ1TailsEncore", .idPC = "OOZ1_T_ENCORE" },222{ .idPS4 = 202, .idUnknown = 199, .idSwitch = 269, .idXbox = "PlusOOZ1KnucklesEncore", .idPC = "OOZ1_K_ENCORE" },223{ .idPS4 = 203, .idUnknown = 200, .idSwitch = 270, .idXbox = "PlusOOZ1MightyEncore", .idPC = "OOZ1_M_ENCORE" },224{ .idPS4 = 204, .idUnknown = 201, .idSwitch = 271, .idXbox = "PlusOOZ1RayEncore", .idPC = "OOZ1_R_ENCORE" },225{ .idPS4 = 205, .idUnknown = 202, .idSwitch = 272, .idXbox = "PlusOOZ2SonicEncore", .idPC = "OOZ2_S_ENCORE" },226{ .idPS4 = 206, .idUnknown = 203, .idSwitch = 273, .idXbox = "PlusOOZ2TailsEncore", .idPC = "OOZ2_T_ENCORE" },227{ .idPS4 = 207, .idUnknown = 204, .idSwitch = 274, .idXbox = "PlusOOZ2KnucklesEncore", .idPC = "OOZ2_K_ENCORE" },228{ .idPS4 = 208, .idUnknown = 205, .idSwitch = 275, .idXbox = "PlusOOZ2MightyEncore", .idPC = "OOZ2_M_ENCORE" },229{ .idPS4 = 209, .idUnknown = 206, .idSwitch = 276, .idXbox = "PlusOOZ2RayEncore", .idPC = "OOZ2_R_ENCORE" },230{ .idPS4 = 210, .idUnknown = 207, .idSwitch = 277, .idXbox = "PlusLRZ1SonicEncore", .idPC = "LRZ1_S_ENCORE" },231{ .idPS4 = 211, .idUnknown = 208, .idSwitch = 278, .idXbox = "PlusLRZ1TailsEncore", .idPC = "LRZ1_T_ENCORE" },232{ .idPS4 = 212, .idUnknown = 209, .idSwitch = 279, .idXbox = "PlusLRZ1KnucklesEncore", .idPC = "LRZ1_K_ENCORE" },233{ .idPS4 = 213, .idUnknown = 210, .idSwitch = 280, .idXbox = "PlusLRZ1MightyEncore", .idPC = "LRZ1_M_ENCORE" },234{ .idPS4 = 214, .idUnknown = 211, .idSwitch = 281, .idXbox = "PlusLRZ1RayEncore", .idPC = "LRZ1_R_ENCORE" },235{ .idPS4 = 215, .idUnknown = 212, .idSwitch = 282, .idXbox = "PlusLRZ2SonicEncore", .idPC = "LRZ2_S_ENCORE" },236{ .idPS4 = 216, .idUnknown = 213, .idSwitch = 283, .idXbox = "PlusLRZ2TailsEncore", .idPC = "LRZ2_T_ENCORE" },237{ .idPS4 = 217, .idUnknown = 214, .idSwitch = 284, .idXbox = "PlusLRZ2KnucklesEncore", .idPC = "LRZ2_K_ENCORE" },238{ .idPS4 = 218, .idUnknown = 215, .idSwitch = 285, .idXbox = "PlusLRZ2MightyEncore", .idPC = "LRZ2_M_ENCORE" },239{ .idPS4 = 219, .idUnknown = 216, .idSwitch = 286, .idXbox = "PlusLRZ2RayEncore", .idPC = "LRZ2_R_ENCORE" },240{ .idPS4 = 220, .idUnknown = 217, .idSwitch = 287, .idXbox = "PlusMMZ1SonicEncore", .idPC = "MMZ1_S_ENCORE" },241{ .idPS4 = 221, .idUnknown = 218, .idSwitch = 288, .idXbox = "PlusMMZ1TailsEncore", .idPC = "MMZ1_T_ENCORE" },242{ .idPS4 = 222, .idUnknown = 219, .idSwitch = 289, .idXbox = "PlusMMZ1KnucklesEncore", .idPC = "MMZ1_K_ENCORE" },243{ .idPS4 = 223, .idUnknown = 220, .idSwitch = 290, .idXbox = "PlusMMZ1MightyEncore", .idPC = "MMZ1_M_ENCORE" },244{ .idPS4 = 224, .idUnknown = 221, .idSwitch = 291, .idXbox = "PlusMMZ1RayEncore", .idPC = "MMZ1_R_ENCORE" },245{ .idPS4 = 225, .idUnknown = 222, .idSwitch = 292, .idXbox = "PlusMMZ2SonicEncore", .idPC = "MMZ2_S_ENCORE" },246{ .idPS4 = 226, .idUnknown = 223, .idSwitch = 293, .idXbox = "PlusMMZ2TailsEncore", .idPC = "MMZ2_T_ENCORE" },247{ .idPS4 = 227, .idUnknown = 224, .idSwitch = 294, .idXbox = "PlusMMZ2KnucklesEncore", .idPC = "MMZ2_K_ENCORE" },248{ .idPS4 = 228, .idUnknown = 225, .idSwitch = 295, .idXbox = "PlusMMZ2MightyEncore", .idPC = "MMZ2_M_ENCORE" },249{ .idPS4 = 229, .idUnknown = 226, .idSwitch = 296, .idXbox = "PlusMMZ2RayEncore", .idPC = "MMZ2_R_ENCORE" },250{ .idPS4 = 230, .idUnknown = 227, .idSwitch = 297, .idXbox = "PlusTMZ1SonicEncore", .idPC = "TMZ1_S_ENCORE" },251{ .idPS4 = 231, .idUnknown = 228, .idSwitch = 298, .idXbox = "PlusTMZ1TailsEncore", .idPC = "TMZ1_T_ENCORE" },252{ .idPS4 = 232, .idUnknown = 229, .idSwitch = 299, .idXbox = "PlusTMZ1KnucklesEncore", .idPC = "TMZ1_K_ENCORE" },253{ .idPS4 = 233, .idUnknown = 230, .idSwitch = 300, .idXbox = "PlusTMZ1MightyEncore", .idPC = "TMZ1_M_ENCORE" },254{ .idPS4 = 234, .idUnknown = 231, .idSwitch = 301, .idXbox = "PlusTMZ1RayEncore", .idPC = "TMZ1_R_ENCORE" },255{ .idPS4 = 235, .idUnknown = 232, .idSwitch = 302, .idXbox = "PlusTMZ2SonicEncore", .idPC = "TMZ2_S_ENCORE" },256{ .idPS4 = 236, .idUnknown = 233, .idSwitch = 303, .idXbox = "PlusTMZ2TailsEncore", .idPC = "TMZ2_T_ENCORE" },257{ .idPS4 = 237, .idUnknown = 234, .idSwitch = 304, .idXbox = "PlusTMZ2KnucklesEncore", .idPC = "TMZ2_K_ENCORE" },258{ .idPS4 = 238, .idUnknown = 235, .idSwitch = 305, .idXbox = "PlusTMZ2MightyEncore", .idPC = "TMZ2_M_ENCORE" },259{ .idPS4 = 239, .idUnknown = 236, .idSwitch = 306, .idXbox = "PlusTMZ2RayEncore", .idPC = "TMZ2_R_ENCORE" },260};261// clang-format on262#endif263264void TimeAttackData_Update(void) {}265266void TimeAttackData_LateUpdate(void) {}267268void TimeAttackData_StaticUpdate(void) {}269270void TimeAttackData_Draw(void) {}271272void TimeAttackData_Create(void *data) {}273274void TimeAttackData_StageLoad(void) {}275276#if MANIA_USE_PLUS277void TimeAttackData_TrackActClear(StatInfo *stat, uint8 zone, uint8 act, uint8 characterID, int32 time, int32 rings, int32 score)278{279stat->statID = 0;280stat->name = "ACT_CLEAR";281memset(stat->data, 0, sizeof(stat->data));282283stat->data[0] = (void *)zoneNames[zone];284stat->data[1] = (void *)actNames[act];285stat->data[2] = (void *)playerNames[characterID];286stat->data[3] = 0;287stat->data[4] = INT_TO_VOID(time);288stat->data[5] = INT_TO_VOID(rings);289stat->data[6] = INT_TO_VOID(score);290}291void TimeAttackData_TrackTAClear(StatInfo *stat, uint8 zone, uint8 actID, uint8 characterID, int32 gameMode, int32 time)292{293stat->statID = 1;294stat->name = "TA_CLEAR";295memset(stat->data, 0, sizeof(stat->data));296297stat->data[0] = (void *)zoneNames[zone];298stat->data[1] = (void *)actNames[actID];299stat->data[2] = (void *)playerNames[characterID];300stat->data[3] = (void *)modeNames[gameMode];301stat->data[4] = INT_TO_VOID(time);302}303void TimeAttackData_TrackEnemyDefeat(StatInfo *stat, uint8 zoneID, uint8 actID, uint8 characterID, bool32 encore, int32 x, int32 y)304{305stat->statID = 2;306stat->name = "ENEMY_DEFEAT";307memset(stat->data, 0, sizeof(stat->data));308309stat->data[0] = (void *)zoneNames[zoneID];310stat->data[1] = (void *)actNames[actID];311stat->data[2] = (void *)playerNames[characterID];312stat->data[3] = INT_TO_VOID(encore);313stat->data[4] = INT_TO_VOID(x);314stat->data[5] = INT_TO_VOID(y);315}316#endif317318TimeAttackRAM *TimeAttackData_GetTimeAttackRAM(void) { return (TimeAttackRAM *)&globals->saveRAM[0x800]; }319320void TimeAttackData_Clear(void)321{322EntityMenuParam *param = MenuParam_GetParam();323324param->puyoSelection = PUYO_SELECTION_NONE;325memset(param->menuTag, 0, sizeof(param->menuTag));326param->menuSelection = 0;327param->startedTAAttempt = false;328param->inTimeAttack = false;329param->zoneID = 0;330param->actID = 0;331332#if MANIA_USE_PLUS333param->timeAttackRank = 0;334globals->gameMode = MODE_MANIA;335#else336param->timeScore = 0;337globals->gameMode = MODE_NOSAVE;338#endif339340globals->suppressAutoMusic = false;341globals->suppressTitlecard = false;342}343int32 TimeAttackData_GetManiaListPos(int32 zoneID, int32 act, int32 characterID)344{345int32 listPos = 0;346switch (zoneID) {347case ZONE_GHZ:348case ZONE_CPZ:349case ZONE_SPZ:350case ZONE_FBZ:351case ZONE_PGZ:352case ZONE_SSZ: listPos = act + 2 * zoneID; break;353354case ZONE_HCZ: listPos = act + (2 * zoneID + 1); break;355356case ZONE_MSZ:357if (act != ACT_1)358listPos = 2 * zoneID + 3;359else360listPos = (characterID == CHAR_KNUX) + 1 + 2 * zoneID;361break;362363case ZONE_OOZ:364case ZONE_LRZ: listPos = act + 2 * (zoneID + 1); break;365366case ZONE_MMZ:367case ZONE_TMZ: listPos = act + (2 * zoneID + 3); break;368369default: break;370}371372LogHelpers_Print("playerID = %d, zoneID = %d, act = %d", characterID, zoneID, act);373LogHelpers_Print("listPos = %d", listPos);374375return listPos;376}377#if MANIA_USE_PLUS378int32 TimeAttackData_GetEncoreListPos(int32 zoneID, int32 act, int32 characterID)379{380int32 listPos = 0;381switch (zoneID) {382case ZONE_GHZ:383case ZONE_CPZ:384case ZONE_SPZ:385case ZONE_FBZ:386case ZONE_PGZ:387case ZONE_SSZ: listPos = act + 2 * zoneID; break;388389case ZONE_HCZ:390case ZONE_MSZ:391case ZONE_OOZ:392case ZONE_LRZ: listPos = act + 2 * zoneID + 1; break;393394case ZONE_MMZ:395case ZONE_TMZ: listPos = act + 2 * (zoneID + 1); break;396397default: break;398}399400LogHelpers_Print("playerID = %d, zoneID = %d, act = %d", characterID, zoneID, act);401LogHelpers_Print("listPos = %d", listPos);402return listPos;403}404#endif405406uint32 TimeAttackData_GetPackedTime(int32 minutes, int32 seconds, int32 milliseconds) { return 6000 * minutes + 100 * seconds + milliseconds; }407408void TimeAttackData_GetUnpackedTime(int32 time, int32 *minutes, int32 *seconds, int32 *milliseconds)409{410if (minutes)411*minutes = time / 6000;412413if (seconds)414*seconds = time % 6000 / 100;415416if (milliseconds)417*milliseconds = time % 100;418}419420uint16 *TimeAttackData_GetRecordedTime(uint8 zoneID, uint8 act, uint8 characterID, uint8 rank)421{422rank--;423if (rank >= 3)424return NULL;425426TimeAttackRAM *recordsRAM = NULL;427if (globals->saveLoaded == STATUS_OK)428recordsRAM = TimeAttackData_GetTimeAttackRAM();429else430return NULL;431432return &recordsRAM->records[characterID - 1][zoneID][act][rank];433}434435#if MANIA_USE_PLUS436void TimeAttackData_CreateDB(void)437{438uint16 id = API.InitUserDB("TimeAttackDB.bin", DBVAR_UINT8, "zoneID", DBVAR_UINT8, "act", DBVAR_UINT8, "characterID", DBVAR_UINT8, "encore",439DBVAR_UINT32, "score", DBVAR_UINT32, "replayID", NULL);440globals->taTableID = id;441if (id == (uint16)-1) {442globals->taTableLoaded = STATUS_ERROR;443}444else {445globals->taTableLoaded = STATUS_OK;446if (!API_GetNoSave() && globals->saveLoaded == STATUS_OK) {447TimeAttackData_MigrateLegacySaves();448}449}450}451452uint16 TimeAttackData_LoadDB(void (*callback)(bool32 success))453{454LogHelpers_Print("Loading Time Attack DB");455globals->taTableLoaded = STATUS_CONTINUE;456457TimeAttackData->loadEntityPtr = SceneInfo->entity;458TimeAttackData->loadCallback = callback;459globals->taTableID = API.LoadUserDB("TimeAttackDB.bin", TimeAttackData_LoadDBCallback);460461if (globals->taTableID == -1) {462LogHelpers_Print("Couldn't claim a slot for loading %s", "TimeAttackDB.bin");463globals->taTableLoaded = STATUS_ERROR;464}465466return globals->taTableID;467}468469void TimeAttackData_SaveDB(void (*callback)(bool32 success))470{471if (API.GetNoSave() || globals->taTableID == (uint16)-1 || globals->taTableLoaded != STATUS_OK) {472if (callback)473callback(false);474}475else {476LogHelpers_Print("Saving Time Attack DB");477478TimeAttackData->saveEntityPtr = SceneInfo->entity;479TimeAttackData->saveCallback = callback;480481API.SaveUserDB(globals->taTableID, TimeAttackData_SaveDBCallback);482}483}484485void TimeAttackData_LoadDBCallback(int32 status)486{487if (status == STATUS_OK) {488globals->taTableLoaded = STATUS_OK;489API.SetupUserDBRowSorting(globals->taTableID);490LogHelpers_Print("Load Succeeded! Replay count: %d", API.GetSortedUserDBRowCount(globals->taTableID));491}492else {493LogHelpers_Print("Load Failed! Creating new Time Attack DB");494TimeAttackData_CreateDB();495}496497// Bug Details:498// Due to how options work, this is called after the db is loaded, but before the result is assigned to globals->taTableID499// meaning that globals->taTableID will be 0xFFFF initially, even if the tabel id was loaded and returned successfully500LogHelpers_Print("Replay DB Slot => %d, Load Status => %d", globals->taTableID, globals->taTableLoaded);501502if (TimeAttackData->loadCallback) {503Entity *entStore = SceneInfo->entity;504if (TimeAttackData->loadEntityPtr)505SceneInfo->entity = TimeAttackData->loadEntityPtr;506TimeAttackData->loadCallback(status == STATUS_OK);507SceneInfo->entity = entStore;508509TimeAttackData->loadCallback = NULL;510TimeAttackData->loadEntityPtr = NULL;511}512}513514void TimeAttackData_SaveDBCallback(int32 status)515{516if (TimeAttackData->saveCallback) {517Entity *entStore = SceneInfo->entity;518if (TimeAttackData->saveEntityPtr)519SceneInfo->entity = TimeAttackData->saveEntityPtr;520TimeAttackData->saveCallback(status == STATUS_OK);521SceneInfo->entity = entStore;522523TimeAttackData->saveCallback = NULL;524TimeAttackData->saveEntityPtr = NULL;525}526}527528void TimeAttackData_MigrateLegacySaves(void)529{530if (globals->saveLoaded == STATUS_OK) {531TimeAttackData->isMigratingData = true;532533LogHelpers_Print("===========================");534LogHelpers_Print("Migrating Legacy TA Data...");535LogHelpers_Print("===========================");536537for (int32 zone = ZONE_GHZ; zone <= ZONE_TMZ; ++zone) {538for (int32 act = ACT_1; act <= ACT_2; ++act) {539for (int32 charID = CHAR_SONIC; charID <= CHAR_KNUX; ++charID) {540for (int32 rank = 0; rank < 3; ++rank) {541uint16 *records = TimeAttackData_GetRecordedTime(zone, act, charID, rank + 1);542if (records && *records) {543int32 score = *records;544LogHelpers_Print("Import: zone=%d act=%d charID=%d rank=%d -> %d", zone, act, charID, rank, score);545TimeAttackData_AddRecord(zone, act, charID, MODE_MANIA, score, NULL);546}547}548}549}550}551552TimeAttackData->isMigratingData = false;553}554}555556int32 TimeAttackData_AddDBRow(uint8 zoneID, uint8 act, uint8 characterID, uint8 mode, int32 score)557{558if (globals->taTableLoaded != STATUS_OK)559return -1;560561uint16 rowID = API.AddUserDBRow(globals->taTableID);562uint8 encore = mode & 1;563uint32 replayID = 0;564565API.SetUserDBValue(globals->taTableID, rowID, DBVAR_UINT8, "zoneID", &zoneID);566API.SetUserDBValue(globals->taTableID, rowID, DBVAR_UINT8, "act", &act);567API.SetUserDBValue(globals->taTableID, rowID, DBVAR_UINT8, "characterID", &characterID);568API.SetUserDBValue(globals->taTableID, rowID, DBVAR_UINT8, "encore", &encore);569API.SetUserDBValue(globals->taTableID, rowID, DBVAR_UINT32, "score", &score);570API.SetUserDBValue(globals->taTableID, rowID, DBVAR_UINT32, "replayID", &replayID);571572uint32 uuid = API.GetUserDBRowUUID(globals->taTableID, rowID);573char buf[0x20];574memset(buf, 0, sizeof(buf));575API.GetUserDBRowCreationTime(globals->taTableID, rowID, buf, sizeof(buf) - 1, "%Y/%m/%d %H:%M:%S");576577LogHelpers_Print("Time Attack DB Added Entry");578LogHelpers_Print("Created at %s", buf);579LogHelpers_Print("Row ID: %d", rowID);580LogHelpers_Print("UUID: %08X", uuid);581582return rowID;583}584585int32 TimeAttackData_AddRecord(uint8 zoneID, uint8 act, uint8 characterID, bool32 encore, int32 score, void (*callback)(bool32 success))586{587uint16 row = TimeAttackData_AddDBRow(zoneID, act, characterID, encore, score);588uint32 uuid = API.GetUserDBRowUUID(globals->taTableID, row);589590TimeAttackData_ConfigureTableView(zoneID, act, characterID, encore);591592if (API.GetSortedUserDBRowCount(globals->taTableID) > 3) {593API.RemoveDBRow(globals->taTableID, API.GetSortedUserDBRowID(globals->taTableID, 3));594595TimeAttackData_ConfigureTableView(zoneID, act, characterID, encore);596}597598int32 rank = 0;599int32 rowID = 0;600for (rank = 0; rank < 3; ++rank) {601rowID = API.GetSortedUserDBRowID(globals->taTableID, rank);602if (API.GetUserDBRowUUID(globals->taTableID, rowID) == uuid)603break;604}605606if (rank == 3) {607if (callback)608callback(false);609610return 0;611}612613TimeAttackData->uuid = uuid;614TimeAttackData->rowID = rowID;615TimeAttackData->personalRank = rank + 1;616617if (TimeAttackData->isMigratingData) {618if (callback)619callback(true);620}621else {622TimeAttackData_SaveDB(callback);623}624625return rank + 1;626}627628int32 TimeAttackData_GetScore(uint8 zoneID, uint8 act, uint8 characterID, bool32 encore, int32 rank)629{630if (rank > 3 && rank)631return 0;632633uint8 rankID = rank - 1;634if (!TimeAttackData->loaded || characterID != TimeAttackData->characterID || zoneID != TimeAttackData->zoneID || act != TimeAttackData->act635|| encore != TimeAttackData->encore) {636TimeAttackData_ConfigureTableView(zoneID, act, characterID, encore);637}638639int32 rowID = API.GetSortedUserDBRowID(globals->taTableID, rankID);640if (rowID == -1)641return 0;642643int32 score = 0;644API.GetUserDBValue(globals->taTableID, rowID, DBVAR_UINT32, "score", &score);645646return score;647}648649int32 TimeAttackData_GetReplayID(uint8 zoneID, uint8 act, uint8 characterID, bool32 encore, int32 rank)650{651if (rank > 3 && rank)652return 0;653654uint8 rankID = rank - 1;655if (!TimeAttackData->loaded || characterID != TimeAttackData->characterID || zoneID != TimeAttackData->zoneID || act != TimeAttackData->act656|| encore != TimeAttackData->encore) {657TimeAttackData_ConfigureTableView(zoneID, act, characterID, encore);658}659660int32 row = API.GetSortedUserDBRowID(globals->taTableID, rankID);661if (row != -1) {662int32 replayID = 0;663API.GetUserDBValue(globals->taTableID, row, DBVAR_UINT32, "replayID", &replayID);664665return replayID;666}667668return 0;669}670671void TimeAttackData_ConfigureTableView(uint8 zoneID, uint8 act, uint8 characterID, bool32 encore)672{673LogHelpers_Print("ConfigureTableView(%d, %d, %d, %d)", characterID, zoneID, act, encore);674675// setup every sort row ID for every entry676API.SetupUserDBRowSorting(globals->taTableID);677678// remove any sort row IDs that dont match the following values679API.AddRowSortFilter(globals->taTableID, DBVAR_UINT8, "zoneID", &zoneID);680API.AddRowSortFilter(globals->taTableID, DBVAR_UINT8, "act", &act);681API.AddRowSortFilter(globals->taTableID, DBVAR_UINT8, "characterID", &characterID);682API.AddRowSortFilter(globals->taTableID, DBVAR_UINT8, "encore", &encore);683684// sort the remaining rows685API.SortDBRows(globals->taTableID, DBVAR_UINT32, "score", false);686687TimeAttackData->loaded = true;688TimeAttackData->zoneID = zoneID;689TimeAttackData->act = act;690TimeAttackData->characterID = characterID;691TimeAttackData->encore = encore & 1;692}693694void TimeAttackData_Leaderboard_GetRank(bool32 success, int32 rank)695{696if (success) {697LogHelpers_Print("Got back leaderboard rank: %d. Not bad!", rank);698TimeAttackData->leaderboardRank = rank;699}700}701702void TimeAttackData_AddLeaderboardEntry(uint8 zoneID, uint8 act, uint8 characterID, bool32 isEncore, int32 score)703{704StatInfo stat;705TimeAttackData_TrackTAClear(&stat, zoneID, act, characterID, isEncore, score);706API.TryTrackStat(&stat);707708LeaderboardID *curLeaderboard = TimeAttackData_GetLeaderboardInfo(zoneID, act, characterID, isEncore);709710API.TrackScore(curLeaderboard, score, TimeAttackData_Leaderboard_GetRank);711}712713LeaderboardID *TimeAttackData_GetLeaderboardInfo(uint8 zoneID, uint8 act, uint8 characterID, bool32 isEncore)714{715LeaderboardID *info = NULL;716if (zoneID < 12 && act < 2 && characterID <= 5) {717int32 id = 10 * zoneID + 5 * act + (characterID - 1);718if (isEncore)719id += 120;720721info = &leaderboardInfo[id];722}723724return info;725}726727#else728void TimeAttackData_AddRecord(uint8 zone, uint8 act, uint8 characterID, uint8 rank, uint16 score)729{730rank--;731if (rank < 3) {732// playerID * (12 zones)733// zone * (2 acts)734// act * (3 ranks)735uint16 *record = TimeAttackData_GetRecordedTime(zone, act, characterID, 1);736737for (int32 r = 2; r > rank; --r) record[r] = record[r - 1];738739record[rank] = score;740}741}742#endif743744#if GAME_INCLUDE_EDITOR745void TimeAttackData_EditorDraw(void) {}746747void TimeAttackData_EditorLoad(void) {}748#endif749750void TimeAttackData_Serialize(void) {}751752753