Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/BSS/BSS_Message.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: BSS_Message Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectBSS_Message *BSS_Message;
11
12
void BSS_Message_Update(void)
13
{
14
RSDK_THIS(BSS_Message);
15
16
StateMachine_Run(self->state);
17
}
18
19
void BSS_Message_LateUpdate(void) {}
20
21
void BSS_Message_StaticUpdate(void) {}
22
23
void BSS_Message_Draw(void)
24
{
25
RSDK_THIS(BSS_Message);
26
Vector2 drawPos;
27
28
drawPos.x = (ScreenInfo->center.x - self->messageFinishTimer) << 16;
29
drawPos.y = TO_FIXED(104);
30
RSDK.DrawSprite(&self->leftAnimator, &drawPos, true);
31
32
drawPos.x = (ScreenInfo->center.x + self->messageFinishTimer) << 16;
33
RSDK.DrawSprite(&self->rightAnimator, &drawPos, true);
34
35
if (self->fadeEnabled)
36
RSDK.FillScreen(self->color, self->timer, self->timer - 128, self->timer - 256);
37
}
38
39
void BSS_Message_Create(void *data)
40
{
41
RSDK_THIS(BSS_Message);
42
43
if (!SceneInfo->inEditor) {
44
self->active = ACTIVE_NORMAL;
45
self->visible = true;
46
self->drawGroup = 15;
47
48
switch (VOID_TO_INT(data)) {
49
case BSS_MESSAGE_GETSPHERES:
50
self->fadeEnabled = true;
51
self->color = 0xF0F0F0;
52
self->timer = 512;
53
self->state = BSS_Message_State_GetBS;
54
55
RSDK.SetSpriteAnimation(BSS_Message->aniFrames, 2, &self->leftAnimator, true, 0);
56
RSDK.SetSpriteAnimation(BSS_Message->aniFrames, 2, &self->rightAnimator, true, 1);
57
break;
58
case BSS_MESSAGE_PERFECT:
59
self->messageFinishTimer = 320;
60
self->state = BSS_Message_State_Perfect;
61
62
RSDK.SetSpriteAnimation(BSS_Message->aniFrames, 3, &self->leftAnimator, true, 0);
63
RSDK.SetSpriteAnimation(BSS_Message->aniFrames, 3, &self->rightAnimator, true, 1);
64
break;
65
case BSS_MESSAGE_FINISHED:
66
self->fadeEnabled = true;
67
self->color = 0x000000;
68
self->state = BSS_Message_State_Finished;
69
break;
70
}
71
}
72
}
73
74
void BSS_Message_StageLoad(void)
75
{
76
BSS_Message->aniFrames = RSDK.LoadSpriteAnimation("SpecialBS/HUD.bin", SCOPE_STAGE);
77
78
RSDK.ResetEntitySlot(SLOT_BSS_MESSAGE, BSS_Message->classID, INT_TO_VOID(BSS_MESSAGE_GETSPHERES));
79
}
80
81
void BSS_Message_State_GetBS(void)
82
{
83
RSDK_THIS(BSS_Message);
84
85
if (self->timer == 512) {
86
Music_SetMusicTrack("BlueSpheresSPD.ogg", TRACK_STAGE, 5309957);
87
Music_PlayTrack(TRACK_STAGE);
88
}
89
90
if (self->timer <= 0) {
91
self->timer = 0;
92
self->fadeEnabled = false;
93
self->state = BSS_Message_State_GetBSWait;
94
}
95
else {
96
self->timer -= 16;
97
}
98
}
99
100
void BSS_Message_State_GetBSWait(void)
101
{
102
RSDK_THIS(BSS_Message);
103
104
EntityBSS_Setup *setup = RSDK_GET_ENTITY(SLOT_BSS_SETUP, BSS_Setup);
105
EntityBSS_Player *player = RSDK_GET_ENTITY(SLOT_PLAYER1, BSS_Player);
106
107
if (!setup->speedupLevel) {
108
if (player->up) {
109
setup->speedupLevel = 16;
110
setup->globeSpeed = 16;
111
setup->globeSpeedInc = 2;
112
113
if (player->onGround)
114
RSDK.SetSpriteAnimation(player->aniFrames, 1, &player->animator, false, 0);
115
116
self->state = BSS_Message_State_WaitPerfect;
117
}
118
119
if (!setup->globeTimer && setup->state == BSS_Setup_State_GlobeMoveZ) {
120
if (player->left)
121
setup->state = BSS_Setup_State_GlobeTurnLeft;
122
123
if (player->right)
124
setup->state = BSS_Setup_State_GlobeTurnRight;
125
}
126
}
127
128
if (++self->timer >= 180) {
129
self->timer = 0;
130
131
setup->speedupLevel = 16;
132
setup->globeSpeed = 16;
133
setup->globeSpeedInc = 2;
134
135
if (player->onGround)
136
RSDK.SetSpriteAnimation(player->aniFrames, 1, &player->animator, false, 0);
137
138
self->state = BSS_Message_State_MsgFinished;
139
}
140
}
141
142
void BSS_Message_State_Finished(void)
143
{
144
RSDK_THIS(BSS_Message);
145
146
if (self->timer >= 768)
147
self->state = BSS_Message_State_SaveGameProgress;
148
else
149
self->timer += 8;
150
}
151
152
void BSS_Message_State_Perfect(void)
153
{
154
RSDK_THIS(BSS_Message);
155
156
self->messageFinishTimer -= 16;
157
if (self->messageFinishTimer <= 0)
158
self->state = BSS_Message_State_WaitPerfect;
159
}
160
161
void BSS_Message_State_WaitPerfect(void)
162
{
163
RSDK_THIS(BSS_Message);
164
165
if (++self->timer >= 180) {
166
self->timer = 0;
167
self->state = BSS_Message_State_MsgFinished;
168
}
169
}
170
171
void BSS_Message_State_MsgFinished(void)
172
{
173
RSDK_THIS(BSS_Message);
174
175
self->messageFinishTimer += 16;
176
if (self->messageFinishTimer > 320)
177
destroyEntity(self);
178
}
179
180
#if MANIA_USE_PLUS
181
void BSS_Message_TrackProgressCB(bool32 success)
182
{
183
RSDK_THIS(BSS_Message);
184
185
self->saveInProgress = false;
186
UIWaitSpinner_FinishWait();
187
}
188
#else
189
void BSS_Message_TrackProgressCB(void)
190
{
191
RSDK_THIS(BSS_Message);
192
193
self->saveInProgress = false;
194
UIWaitSpinner_FinishWait();
195
}
196
#endif
197
198
void BSS_Message_State_SaveGameProgress(void)
199
{
200
RSDK_THIS(BSS_Message);
201
202
if (self->color) {
203
self->color -= 0x80808;
204
}
205
else {
206
EntityMenuParam *param = MenuParam_GetParam();
207
208
if (param->bssSelection == BSS_SELECTION_EXTRAS) {
209
RSDK.SetScene("Presentation", "Menu");
210
RSDK.LoadScene();
211
}
212
else if (globals->gameMode < MODE_TIMEATTACK) {
213
if (globals->saveSlotID == NO_SAVE_SLOT) {
214
BSS_Message_State_LoadPrevScene();
215
}
216
else {
217
self->state = BSS_Message_State_LoadPrevScene;
218
self->saveInProgress = true;
219
220
UIWaitSpinner_StartWait();
221
GameProgress_TrackGameProgress(BSS_Message_TrackProgressCB);
222
}
223
}
224
}
225
}
226
227
void BSS_Message_State_LoadPrevScene(void)
228
{
229
RSDK_THIS(BSS_Message);
230
231
if (!self->saveInProgress) {
232
globals->blueSpheresInit = true;
233
GameProgress_ShuffleBSSID();
234
235
SaveRAM *saveRAM = SaveGame_GetSaveRAM();
236
#if MANIA_USE_PLUS
237
if (globals->gameMode == MODE_ENCORE)
238
RSDK.SetScene("Encore Mode", "");
239
else
240
#endif
241
RSDK.SetScene("Mania Mode", "");
242
243
SceneInfo->listPos = saveRAM->storedStageID;
244
RSDK.LoadScene();
245
self->state = StateMachine_None;
246
}
247
}
248
249
#if GAME_INCLUDE_EDITOR
250
void BSS_Message_EditorDraw(void) {}
251
252
void BSS_Message_EditorLoad(void) {}
253
#endif
254
255
void BSS_Message_Serialize(void) {}
256
257