Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/Summary/Summary.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: Summary Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
#if MANIA_USE_PLUS
11
ObjectSummary *Summary;
12
13
void Summary_Update(void)
14
{
15
RSDK_THIS(Summary);
16
17
StateMachine_Run(self->state);
18
19
ScreenInfo->position.x = 0x100 - ScreenInfo->center.x;
20
}
21
22
void Summary_LateUpdate(void) {}
23
24
void Summary_StaticUpdate(void)
25
{
26
if (--Summary->bgAniDuration <= 0) {
27
++Summary->bgAniFrame;
28
Summary->bgAniFrame &= 3;
29
Summary->bgAniDuration = Summary->bgAniDurationTable[Summary->bgAniFrame];
30
31
TileLayer *background = RSDK.GetTileLayer(0);
32
background->scrollPos = (background->scrollPos + 0x1000000) & 0x7FF0000;
33
}
34
}
35
36
void Summary_Draw(void)
37
{
38
RSDK_THIS(Summary);
39
40
StateMachine_Run(self->stateDraw);
41
}
42
43
void Summary_Create(void *data)
44
{
45
RSDK_THIS(Summary);
46
47
if (!SceneInfo->inEditor) {
48
self->active = ACTIVE_ALWAYS;
49
self->visible = true;
50
self->drawGroup = 12;
51
self->state = Summary_State_SetupText;
52
self->stateDraw = Summary_State_Draw;
53
self->timer = 640;
54
}
55
}
56
57
void Summary_StageLoad(void)
58
{
59
RSDK.ResetEntitySlot(0, Summary->classID, NULL);
60
61
UIPicture->aniFrames = RSDK.LoadSpriteAnimation("LSelect/Icons.bin", SCOPE_STAGE);
62
UIText->aniFrames = RSDK.LoadSpriteAnimation("LSelect/Text.bin", SCOPE_STAGE);
63
}
64
65
void Summary_State_Draw(void)
66
{
67
RSDK_THIS(Summary);
68
69
RSDK.FillScreen(0x000000, self->timer, self->timer - 128, self->timer - 256);
70
}
71
72
void Summary_State_SetupText(void)
73
{
74
RSDK_THIS(Summary);
75
76
self->unusedPtr = NULL;
77
self->gameModeLabel = NULL;
78
self->saveFileLabel = NULL;
79
80
foreach_all(UIText, text)
81
{
82
switch (text->align) {
83
default:
84
case UITEXT_ALIGN_LEFT: break;
85
86
case UITEXT_ALIGN_CENTER:
87
if (self->gameModeLabel)
88
self->saveFileLabel = text;
89
else
90
self->gameModeLabel = text;
91
break;
92
93
case UITEXT_ALIGN_RIGHT:
94
if (text->data1 == 0xFF) {
95
self->totalTime = text;
96
}
97
else {
98
if (text->data0 > -1 && text->data0 < 32)
99
self->zoneLabels[text->data0] = text;
100
}
101
break;
102
}
103
}
104
105
self->leaderCharacterID = HUD_CharacterIndexFromID(GET_CHARACTER_ID(1)) + 1;
106
self->sidekickCharacterID = HUD_CharacterIndexFromID(GET_CHARACTER_ID(2)) + 1;
107
108
foreach_all(UIPicture, picture)
109
{
110
if (picture->listID == 3) {
111
if (picture->frameID == 1)
112
self->player2Icon = picture;
113
else
114
self->player1Icon = picture;
115
}
116
}
117
118
self->player2Icon->animator.frameID = self->leaderCharacterID;
119
self->player1Icon->animator.frameID = self->sidekickCharacterID;
120
121
Summary_LoadTimes();
122
self->state = Summary_State_FadeIn;
123
}
124
125
void Summary_State_FadeIn(void)
126
{
127
RSDK_THIS(Summary);
128
129
if (self->timer <= 0) {
130
self->timer = 0;
131
self->state = Summary_State_Wait;
132
self->stateDraw = StateMachine_None;
133
}
134
else {
135
self->timer -= 16;
136
}
137
}
138
139
void Summary_State_Wait(void)
140
{
141
RSDK_THIS(Summary);
142
143
if (ControllerInfo->keyStart.press || (API_GetConfirmButtonFlip() ? ControllerInfo->keyB.press : ControllerInfo->keyA.press)) {
144
RSDK.SetScene("Presentation", "Menu");
145
self->timer = 0;
146
self->state = Summary_State_FadeOut;
147
self->stateDraw = Summary_State_Draw;
148
Music_FadeOut(0.01);
149
}
150
else {
151
self->timer = 0;
152
}
153
}
154
155
void Summary_State_FadeOut(void)
156
{
157
RSDK_THIS(Summary);
158
159
if (self->timer >= 0x400)
160
RSDK.LoadScene();
161
else
162
self->timer += 0x10;
163
}
164
165
void Summary_SetTextString(uint8 anim, EntityUIText *text, const char *str)
166
{
167
if (!UIWidgets || UIText->aniFrames)
168
RSDK.SetSpriteAnimation(UIText->aniFrames, anim, &text->animator, true, 0);
169
else
170
RSDK.SetSpriteAnimation(UIWidgets->uiFrames, anim, &text->animator, true, 0);
171
172
RSDK.SetString(&text->text, str);
173
text->listID = anim;
174
175
if (!UIWidgets || UIText->aniFrames)
176
RSDK.SetSpriteString(UIText->aniFrames, text->listID, &text->text);
177
else
178
RSDK.SetSpriteString(UIWidgets->uiFrames, text->listID, &text->text);
179
}
180
void Summary_GetPlayTime(char *buffer, int32 time)
181
{
182
if (!time) {
183
sprintf(buffer, "--'--\"--");
184
}
185
else {
186
int32 packedTime = 100 * time;
187
int32 hours = 0;
188
int32 minutes = 0;
189
int32 seconds = 0;
190
int32 milliseconds = 0;
191
192
while (packedTime >= 6000) {
193
++seconds;
194
packedTime -= MIN(packedTime, 6025);
195
}
196
197
if (seconds >= 60) {
198
minutes = (seconds - 60) / 60 + 1;
199
seconds -= 60 * minutes;
200
}
201
202
milliseconds = (packedTime / 60) & 0xFF;
203
204
if (minutes >= 60) {
205
hours = (minutes - 60) / 60 + 1;
206
minutes -= 60 * hours;
207
208
sprintf(buffer, "%d:%02d'%02d\"%02d", hours, minutes, seconds, milliseconds);
209
}
210
else {
211
sprintf(buffer, "%02d'%02d\"%02d", minutes, seconds, milliseconds);
212
}
213
}
214
}
215
216
void Summary_LoadTimes(void)
217
{
218
RSDK_THIS(Summary);
219
220
if (globals->gameMode == MODE_ENCORE) {
221
if (Localization->language == LANGUAGE_JP || sku_region == REGION_JP)
222
Summary_SetTextString(1, self->gameModeLabel, "STORY MODE PLUS");
223
else
224
Summary_SetTextString(1, self->gameModeLabel, "ENCORE MODE");
225
}
226
else {
227
if (Localization->language == LANGUAGE_JP || sku_region == REGION_JP) {
228
Summary_SetTextString(1, self->gameModeLabel, "STORY MODE");
229
}
230
else {
231
Summary_SetTextString(1, self->gameModeLabel, "MANIA MODE");
232
}
233
}
234
235
if (globals->saveSlotID == NO_SAVE_SLOT) {
236
Summary_SetTextString(0, self->saveFileLabel, "NO SAVE");
237
}
238
else {
239
char text[0x20];
240
sprintf_s(text, (int32)sizeof(text), "%s %d", "SAVE SLOT", globals->saveSlotID);
241
242
Summary_SetTextString(0, self->saveFileLabel, text);
243
}
244
245
SaveRAM *saveRAM = SaveGame_GetSaveRAM();
246
char playTime[0x100];
247
memset(playTime, 0, 0x100);
248
int32 totalTime = 0;
249
250
for (int32 i = 0; i < 0x20; ++i) {
251
if (self->zoneLabels[i]) {
252
EntityUIText *text = self->zoneLabels[i];
253
254
Summary_GetPlayTime(playTime, saveRAM->zoneTimes[text->data0]);
255
256
int32 newTotal = saveRAM->zoneTimes[text->data0] + totalTime;
257
if (newTotal < totalTime)
258
newTotal = -1;
259
260
totalTime = newTotal;
261
Summary_SetTextString(0, text, playTime);
262
}
263
}
264
265
Summary_GetPlayTime(playTime, totalTime);
266
Summary_SetTextString(0, self->totalTime, playTime);
267
}
268
269
#if GAME_INCLUDE_EDITOR
270
void Summary_EditorDraw(void) {}
271
272
void Summary_EditorLoad(void)
273
{
274
if (UIPicture)
275
UIPicture->aniFrames = RSDK.LoadSpriteAnimation("LSelect/Icons.bin", SCOPE_STAGE);
276
277
if (UIText)
278
UIText->aniFrames = RSDK.LoadSpriteAnimation("LSelect/Text.bin", SCOPE_STAGE);
279
}
280
#endif
281
282
void Summary_Serialize(void) {}
283
#endif
284
285