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