Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/Menu/DemoMenu.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: DemoMenu Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectDemoMenu *DemoMenu = NULL;
11
12
void DemoMenu_Update(void)
13
{
14
RSDK_THIS(DemoMenu);
15
16
StateMachine_Run(self->state);
17
18
self->angle = (self->angle + 1) & 0x1FF;
19
20
if (!(self->angle & 1)) {
21
SpriteFrame *frameA = self->ghzFrame;
22
if (++frameA->sprX > 193)
23
frameA->sprX -= 192;
24
25
SpriteFrame *frameB = self->spzFrame;
26
if (--frameB->sprX <= 0)
27
frameB->sprX += 192;
28
}
29
}
30
31
void DemoMenu_LateUpdate(void) {}
32
33
void DemoMenu_StaticUpdate(void) {}
34
35
void DemoMenu_Draw(void)
36
{
37
RSDK_THIS(DemoMenu);
38
39
RSDK.DrawSprite(&self->zoneSelAnimator, &self->zoneSelPos, false);
40
41
DemoMenu_DrawStagePreview(&self->ghzPos, &self->ghzAnimator, 0);
42
DemoMenu_DrawStagePreview(&self->spzPos, &self->spzAnimator, 1);
43
}
44
45
void DemoMenu_Create(void *data)
46
{
47
RSDK_THIS(DemoMenu);
48
49
RSDK.SetSpriteAnimation(DemoMenu->aniFrames, 0, &self->zoneSelAnimator, true, 0);
50
RSDK.SetSpriteAnimation(DemoMenu->aniFrames, 1, &self->blackBarAnimator, true, 0);
51
RSDK.SetSpriteAnimation(DemoMenu->aniFrames, 2, &self->flashBarAnimator, true, 0);
52
RSDK.SetSpriteAnimation(DemoMenu->aniFrames, 3, &self->ghzAnimator, true, 0);
53
RSDK.SetSpriteAnimation(DemoMenu->aniFrames, 4, &self->spzAnimator, true, 0);
54
55
self->ghzFrame = RSDK.GetFrame(DemoMenu->aniFrames, 3, 2);
56
self->spzFrame = RSDK.GetFrame(DemoMenu->aniFrames, 4, 2);
57
58
if (!SceneInfo->inEditor) {
59
self->zoneSelPos.x = 256 << 16;
60
self->zoneSelPos.y = -(32 << 16);
61
self->ghzPos.x = -(128 << 16);
62
self->ghzPos.y = 104 << 16;
63
self->spzPos.x = 640 << 16;
64
self->spzPos.y = 184 << 16;
65
66
self->active = ACTIVE_NORMAL;
67
self->visible = true;
68
self->drawGroup = 4;
69
self->state = DemoMenu_State_Appear;
70
}
71
}
72
73
void DemoMenu_StageLoad(void) { DemoMenu->aniFrames = RSDK.LoadSpriteAnimation("Title/DemoMenu.bin", SCOPE_STAGE); }
74
75
void DemoMenu_DrawStagePreview(Vector2 *pos, Animator *animator, int32 zoneID)
76
{
77
RSDK_THIS(DemoMenu);
78
79
animator->frameID = 0;
80
RSDK.DrawSprite(animator, pos, false);
81
82
self->blackBarAnimator.frameID = 0;
83
RSDK.DrawSprite(&self->blackBarAnimator, pos, false);
84
85
self->blackBarAnimator.frameID = 1;
86
self->inkEffect = INK_BLEND;
87
RSDK.DrawSprite(&self->blackBarAnimator, pos, false);
88
89
self->inkEffect = INK_NONE;
90
if (zoneID == self->selectedZone) {
91
RSDK.DrawSprite(&self->flashBarAnimator, pos, false);
92
93
animator->frameID = 1;
94
RSDK.DrawSprite(animator, pos, false);
95
96
animator->frameID = 2;
97
RSDK.DrawSprite(animator, pos, false);
98
}
99
else {
100
animator->frameID = 1;
101
RSDK.DrawSprite(animator, pos, false);
102
103
animator->frameID = 2;
104
self->inkEffect = INK_BLEND;
105
RSDK.DrawSprite(animator, pos, false);
106
107
self->inkEffect = INK_NONE;
108
}
109
}
110
void DemoMenu_State_Appear(void)
111
{
112
RSDK_THIS(DemoMenu);
113
114
if (self->zoneSelPos.y < 0x280000)
115
self->zoneSelPos.y += 0x80000;
116
117
if (self->ghzPos.x < 0x1000000)
118
self->ghzPos.x += 0x200000;
119
120
if (self->spzPos.x <= 0x1000000) {
121
self->state = DemoMenu_State_Selection;
122
}
123
else {
124
self->spzPos.x -= 0x200000;
125
}
126
}
127
void DemoMenu_State_Selection(void)
128
{
129
RSDK_THIS(DemoMenu);
130
131
if (ControllerInfo->keyUp.press || ControllerInfo->keyDown.press) {
132
self->selectedZone ^= 1;
133
RSDK.PlaySfx(TitleSetup->sfxMenuBleep, false, 255);
134
}
135
else {
136
#if MANIA_USE_PLUS
137
float vDelta = AnalogStickInfoL->vDelta;
138
float deltaDist = AnalogStickInfoL->vDelta - self->vDelta;
139
#else
140
float vDelta = AnalogStickInfoL->vDeltaL;
141
float deltaDist = AnalogStickInfoL->vDeltaL - self->vDelta;
142
#endif
143
if (deltaDist < 0.0)
144
deltaDist = -deltaDist;
145
146
if (deltaDist > 0.5) {
147
if (vDelta < 0.0)
148
vDelta = -vDelta;
149
150
if (vDelta > 0.5) {
151
self->selectedZone ^= 1;
152
RSDK.PlaySfx(TitleSetup->sfxMenuBleep, false, 255);
153
}
154
155
self->vDelta = vDelta;
156
}
157
}
158
159
if (ControllerInfo->keyStart.press || ControllerInfo->keyA.press) {
160
self->state = DemoMenu_State_Load;
161
Music_Stop();
162
RSDK.PlaySfx(TitleSetup->sfxMenuAccept, false, 255);
163
}
164
}
165
void DemoMenu_State_Load(void)
166
{
167
RSDK_THIS(DemoMenu);
168
169
RSDK.ProcessAnimation(&self->flashBarAnimator);
170
171
if (++self->timer == 30) {
172
self->timer = 0;
173
if (self->selectedZone == 0)
174
RSDK.SetScene("Media Demo", "Green Hill Zone 1");
175
else
176
RSDK.SetScene("Media Demo", "Studiopolis Zone 1");
177
178
foreach_all(TitleSetup, titleSetup)
179
{
180
titleSetup->state = TitleSetup_State_FadeToMenu;
181
titleSetup->stateDraw = TitleSetup_Draw_FadeBlack;
182
}
183
184
self->state = DemoMenu_State_Disappear;
185
}
186
}
187
void DemoMenu_State_Disappear(void)
188
{
189
RSDK_THIS(DemoMenu);
190
191
self->zoneSelPos.y -= 0x80000;
192
self->ghzPos.x += 0x200000;
193
self->spzPos.x -= 0x200000;
194
195
if (++self->timer == 30)
196
destroyEntity(self);
197
}
198
199
#if GAME_INCLUDE_EDITOR
200
void DemoMenu_EditorDraw(void)
201
{
202
RSDK_THIS(DemoMenu);
203
204
self->zoneSelPos.x = self->position.x;
205
self->zoneSelPos.y = self->position.y + -(32 << 16);
206
self->ghzPos.x = self->position.x;
207
self->ghzPos.y = self->position.y + (104 << 16);
208
self->spzPos.x = self->position.x;
209
self->spzPos.y = self->position.y + (184 << 16);
210
211
DemoMenu_Draw();
212
}
213
214
void DemoMenu_EditorLoad(void) { DemoMenu->aniFrames = RSDK.LoadSpriteAnimation("Title/DemoMenu.bin", SCOPE_STAGE); }
215
#endif
216
217
void DemoMenu_Serialize(void) {}
218
219