Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/Menu/E3MenuSetup.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: E3MenuSetup 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
ObjectE3MenuSetup *E3MenuSetup = NULL;
12
13
void E3MenuSetup_Update(void)
14
{
15
RSDK_THIS(E3MenuSetup);
16
17
StateMachine_Run(self->state);
18
19
if (self->timer >= self->delay) {
20
StateMachine_Run(self->callback);
21
22
destroyEntity(self);
23
}
24
else {
25
self->timer++;
26
}
27
}
28
29
void E3MenuSetup_LateUpdate(void) {}
30
31
void E3MenuSetup_StaticUpdate(void)
32
{
33
if (!E3MenuSetup->initialized) {
34
E3MenuSetup_SetupUI();
35
E3MenuSetup->initialized = true;
36
}
37
}
38
39
void E3MenuSetup_Draw(void)
40
{
41
RSDK_THIS(E3MenuSetup);
42
43
RSDK.FillScreen(self->fadeColor, self->fadeTimer, self->fadeTimer - 128, self->fadeTimer - 256);
44
}
45
46
void E3MenuSetup_Create(void *data)
47
{
48
RSDK_THIS(E3MenuSetup);
49
50
self->active = ACTIVE_NORMAL;
51
self->visible = true;
52
self->drawGroup = 14;
53
}
54
55
void E3MenuSetup_StageLoad(void) { RSDK.SetVideoSetting(VIDEOSETTING_SHADERID, 1); }
56
57
void E3MenuSetup_SetupUI(void)
58
{
59
String string;
60
INIT_STRING(string);
61
62
foreach_all(UIControl, control)
63
{
64
RSDK.SetString(&string, "Char Select");
65
if (RSDK.CompareStrings(&string, &control->tag, false))
66
E3MenuSetup->charSelControl = control;
67
68
RSDK.SetString(&string, "Zone");
69
if (RSDK.CompareStrings(&string, &control->tag, false))
70
E3MenuSetup->zoneControl = control;
71
}
72
73
E3MenuSetup_SetupButtons();
74
}
75
76
void E3MenuSetup_SetupButtons(void)
77
{
78
foreach_all(UICharButton, button)
79
{
80
if (button->parent == (Entity *)E3MenuSetup->charSelControl) {
81
switch (button->characterID) {
82
case 0: button->actionCB = E3MenuSetup_ActionCB_Sonic; break;
83
case 1: button->actionCB = E3MenuSetup_ActionCB_Tails; break;
84
case 2: button->actionCB = E3MenuSetup_ActionCB_Knux; break;
85
}
86
}
87
}
88
89
int32 id = 0;
90
foreach_all(UITAZoneModule, module)
91
{
92
module->actionCB = E3MenuSetup_ActionCB_ZoneSelect;
93
94
if (id == 0) { // GHZ2
95
module->zoneID = 0;
96
module->actID = 1;
97
}
98
else if (id == 1) { // MSZ2
99
module->zoneID = 7;
100
module->actID = 1;
101
}
102
++id;
103
}
104
}
105
106
void E3MenuSetup_Callback_LoadScene(void)
107
{
108
EntityMenuParam *param = MenuParam_GetParam();
109
EntityUIControl *control = E3MenuSetup->zoneControl;
110
111
globals->gameMode = MODE_NOSAVE;
112
globals->medalMods = 0;
113
RSDK.SetScene("Mania Mode", "");
114
115
EntityUITAZoneModule *module = (EntityUITAZoneModule *)control->buttons[control->buttonID];
116
param->zoneID = module->zoneID;
117
param->actID = module->actID;
118
119
SceneInfo->listPos += TimeAttackData_GetManiaListPos(param->zoneID, param->characterID, param->actID);
120
switch (param->characterID) {
121
default: break;
122
case 1: globals->playerID = ID_SONIC; break;
123
case 2: globals->playerID = ID_TAILS; break;
124
case 3: globals->playerID = ID_KNUCKLES; break;
125
}
126
127
RSDK.LoadScene();
128
}
129
130
void E3MenuSetup_ActionCB_ZoneSelect(void)
131
{
132
EntityE3MenuSetup *entity = CREATE_ENTITY(E3MenuSetup, NULL, 0xFFF0 << 16, 0xFFF0 << 16);
133
134
entity->fadeColor = 0x000000;
135
entity->delay = 32;
136
entity->fadeSpeed = 5;
137
entity->state = E3MenuSetup_State_FadeOut;
138
entity->callback = E3MenuSetup_Callback_LoadScene;
139
}
140
141
// Sonic Sel
142
void E3MenuSetup_ActionCB_Sonic(void)
143
{
144
EntityMenuParam *param = MenuParam_GetParam();
145
146
TimeAttackData_Clear();
147
param->characterID = 1;
148
149
EntityUIControl *control = E3MenuSetup->zoneControl;
150
for (int32 i = 0; i < control->buttonCount; ++i) {
151
control->buttons[i]->animator.animationID = 1;
152
}
153
154
UIControl_MatchMenuTag("Zones");
155
}
156
157
// Tails Sel
158
void E3MenuSetup_ActionCB_Tails(void)
159
{
160
EntityMenuParam *param = MenuParam_GetParam();
161
162
TimeAttackData_Clear();
163
param->characterID = 2;
164
165
EntityUIControl *control = E3MenuSetup->zoneControl;
166
for (int32 i = 0; i < control->buttonCount; ++i) {
167
control->buttons[i]->animator.animationID = 2;
168
}
169
170
UIControl_MatchMenuTag("Zones");
171
}
172
173
// Knux Sel
174
void E3MenuSetup_ActionCB_Knux(void)
175
{
176
EntityMenuParam *param = MenuParam_GetParam();
177
178
TimeAttackData_Clear();
179
param->characterID = 3;
180
181
EntityUIControl *control = E3MenuSetup->zoneControl;
182
for (int32 i = 0; i < control->buttonCount; ++i) {
183
control->buttons[i]->animator.animationID = 3;
184
}
185
186
UIControl_MatchMenuTag("Zones");
187
}
188
189
void E3MenuSetup_State_FadeOut(void)
190
{
191
RSDK_THIS(E3MenuSetup);
192
193
self->fadeTimer = CLAMP(self->timer << (self->fadeSpeed - 1), 0, 0x200);
194
}
195
196
#if GAME_INCLUDE_EDITOR
197
void E3MenuSetup_EditorDraw(void) {}
198
199
void E3MenuSetup_EditorLoad(void) {}
200
#endif
201
202
void E3MenuSetup_Serialize(void) {}
203
#endif
204
205