Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/Title/TitleLogo.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: TitleLogo Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectTitleLogo *TitleLogo;
11
12
void TitleLogo_Update(void)
13
{
14
RSDK_THIS(TitleLogo);
15
16
#if MANIA_USE_PLUS
17
StateMachine_Run(self->state);
18
#else
19
switch (self->type) {
20
case TITLELOGO_RIBBON:
21
RSDK.ProcessAnimation(&self->mainAnimator);
22
if (self->showRibbonCenter)
23
RSDK.ProcessAnimation(&self->ribbonCenterAnimator);
24
break;
25
26
case TITLELOGO_PRESSSTART: ++self->timer; break;
27
}
28
#endif
29
}
30
31
void TitleLogo_LateUpdate(void) {}
32
33
void TitleLogo_StaticUpdate(void) {}
34
35
void TitleLogo_Draw(void)
36
{
37
RSDK_THIS(TitleLogo);
38
39
switch (self->type) {
40
case TITLELOGO_EMBLEM:
41
RSDK.SetClipBounds(0, 0, 0, ScreenInfo->size.x, ScreenInfo->size.y);
42
43
self->direction = FLIP_NONE;
44
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
45
46
self->direction = FLIP_X;
47
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
48
break;
49
50
case TITLELOGO_RIBBON:
51
self->direction = FLIP_X;
52
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
53
54
self->direction = FLIP_NONE;
55
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
56
57
if (self->showRibbonCenter)
58
RSDK.DrawSprite(&self->ribbonCenterAnimator, NULL, false);
59
break;
60
61
case TITLELOGO_PRESSSTART:
62
if (!(self->timer & 0x10))
63
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
64
break;
65
66
#if MANIA_USE_PLUS
67
case TITLELOGO_PLUS:
68
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
69
RSDK.DrawSprite(&self->plusAnimator, NULL, false);
70
break;
71
#endif
72
73
default: RSDK.DrawSprite(&self->mainAnimator, NULL, false); break;
74
}
75
}
76
77
void TitleLogo_Create(void *data)
78
{
79
RSDK_THIS(TitleLogo);
80
81
self->drawFX = FX_FLIP;
82
83
if (!SceneInfo->inEditor) {
84
switch (self->type) {
85
case TITLELOGO_EMBLEM: RSDK.SetSpriteAnimation(TitleLogo->aniFrames, 0, &self->mainAnimator, true, 0); break;
86
87
case TITLELOGO_RIBBON:
88
RSDK.SetSpriteAnimation(TitleLogo->aniFrames, 1, &self->mainAnimator, true, 0);
89
RSDK.SetSpriteAnimation(TitleLogo->aniFrames, 3, &self->ribbonCenterAnimator, true, 0);
90
#if MANIA_USE_PLUS
91
self->state = TitleLogo_State_Ribbon;
92
#endif
93
break;
94
95
case TITLELOGO_PRESSSTART:
96
#if MANIA_USE_PLUS
97
self->state = TitleLogo_State_PressButton;
98
#else
99
TitleLogo_SetupPressStart();
100
#endif
101
break;
102
103
#if MANIA_USE_PLUS
104
case TITLELOGO_PLUS:
105
if (API.CheckDLC(DLC_PLUS)) {
106
RSDK.SetSpriteAnimation(TitleLogo->plusFrames, 0, &self->mainAnimator, true, 0);
107
self->storeY = self->position.y;
108
}
109
else {
110
destroyEntity(self);
111
return;
112
}
113
break;
114
#endif
115
116
default: RSDK.SetSpriteAnimation(TitleLogo->aniFrames, self->type + 2, &self->mainAnimator, true, 0); break;
117
}
118
119
switch (self->type) {
120
case TITLELOGO_EMBLEM:
121
case TITLELOGO_RIBBON:
122
case TITLELOGO_GAMETITLE:
123
case TITLELOGO_COPYRIGHT:
124
case TITLELOGO_RINGBOTTOM:
125
case TITLELOGO_PRESSSTART:
126
#if MANIA_USE_PLUS
127
case TITLELOGO_PLUS:
128
#endif
129
self->visible = false;
130
self->active = ACTIVE_NEVER;
131
self->drawGroup = 4;
132
break;
133
134
default:
135
self->active = ACTIVE_NORMAL;
136
self->visible = true;
137
self->drawGroup = 4;
138
break;
139
}
140
}
141
}
142
143
void TitleLogo_StageLoad(void)
144
{
145
TitleLogo->aniFrames = RSDK.LoadSpriteAnimation("Title/Logo.bin", SCOPE_STAGE);
146
147
#if MANIA_USE_PLUS
148
if (API.CheckDLC(DLC_PLUS))
149
TitleLogo->plusFrames = RSDK.LoadSpriteAnimation("Title/PlusLogo.bin", SCOPE_STAGE);
150
151
TitleLogo->sfxPlus = RSDK.GetSfx("Stage/Plus.wav");
152
#endif
153
}
154
155
void TitleLogo_SetupPressStart(void)
156
{
157
RSDK_THIS(TitleLogo);
158
159
switch (Localization->language) {
160
case LANGUAGE_EN:
161
case LANGUAGE_JP: RSDK.SetSpriteAnimation(TitleLogo->aniFrames, 8, &self->mainAnimator, true, 0); break;
162
163
case LANGUAGE_FR:
164
if (sku_platform == PLATFORM_SWITCH)
165
RSDK.SetSpriteAnimation(TitleLogo->aniFrames, 8, &self->mainAnimator, true, 2);
166
else
167
RSDK.SetSpriteAnimation(TitleLogo->aniFrames, 8, &self->mainAnimator, true, 1);
168
break;
169
170
case LANGUAGE_IT:
171
if (sku_platform == PLATFORM_XB1 || sku_platform == PLATFORM_SWITCH)
172
RSDK.SetSpriteAnimation(TitleLogo->aniFrames, 8, &self->mainAnimator, true, 4);
173
else
174
RSDK.SetSpriteAnimation(TitleLogo->aniFrames, 8, &self->mainAnimator, true, 3);
175
break;
176
177
case LANGUAGE_GE:
178
if (sku_platform == PLATFORM_SWITCH)
179
RSDK.SetSpriteAnimation(TitleLogo->aniFrames, 8, &self->mainAnimator, true, 6);
180
else
181
RSDK.SetSpriteAnimation(TitleLogo->aniFrames, 8, &self->mainAnimator, true, 5);
182
break;
183
184
case LANGUAGE_SP: RSDK.SetSpriteAnimation(TitleLogo->aniFrames, 8, &self->mainAnimator, true, 7); break;
185
186
#if GAME_VERSION != VER_100
187
case LANGUAGE_KO: RSDK.SetSpriteAnimation(TitleLogo->aniFrames, 8, &self->mainAnimator, true, 8); break;
188
case LANGUAGE_SC: RSDK.SetSpriteAnimation(TitleLogo->aniFrames, 8, &self->mainAnimator, true, 9); break;
189
case LANGUAGE_TC: RSDK.SetSpriteAnimation(TitleLogo->aniFrames, 8, &self->mainAnimator, true, 10); break;
190
#endif
191
192
default: break;
193
}
194
}
195
196
#if MANIA_USE_PLUS
197
void TitleLogo_State_Ribbon(void)
198
{
199
RSDK_THIS(TitleLogo);
200
201
RSDK.ProcessAnimation(&self->mainAnimator);
202
203
if (self->showRibbonCenter)
204
RSDK.ProcessAnimation(&self->ribbonCenterAnimator);
205
}
206
void TitleLogo_State_PressButton(void)
207
{
208
RSDK_THIS(TitleLogo);
209
210
++self->timer;
211
}
212
void TitleLogo_State_HandleSetup(void)
213
{
214
RSDK_THIS(TitleLogo);
215
216
self->position.y += self->velocity.y;
217
self->velocity.y += 0x3800;
218
219
RSDK.ProcessAnimation(&self->mainAnimator);
220
221
if (self->showRibbonCenter)
222
RSDK.ProcessAnimation(&self->ribbonCenterAnimator);
223
224
if (self->velocity.y > 0) {
225
if (self->position.y >= self->storeY) {
226
--self->timer;
227
228
self->position.y = self->storeY;
229
self->velocity.y = -(self->velocity.y >> 1);
230
231
if (self->timer <= 0) {
232
self->timer = 0;
233
234
if (self->type == TITLELOGO_PLUS)
235
self->state = TitleLogo_State_PlusLogo;
236
else
237
self->state = self->type == TITLELOGO_RIBBON ? TitleLogo_State_Ribbon : StateMachine_None;
238
}
239
}
240
}
241
}
242
243
void TitleLogo_State_PlusLogo(void)
244
{
245
RSDK_THIS(TitleLogo);
246
247
if (self->timer <= 0) {
248
self->timer = RSDK.Rand(120, 240);
249
250
RSDK.SetSpriteAnimation(TitleLogo->plusFrames, 1, &self->plusAnimator, true, 0);
251
self->state = TitleLogo_State_PlusShine;
252
}
253
else {
254
self->timer--;
255
}
256
}
257
void TitleLogo_State_PlusShine(void)
258
{
259
RSDK_THIS(TitleLogo);
260
261
RSDK.ProcessAnimation(&self->plusAnimator);
262
263
if (self->plusAnimator.frameID == self->plusAnimator.frameCount - 1) {
264
RSDK.SetSpriteAnimation(-1, 0, &self->plusAnimator, true, 0);
265
self->state = TitleLogo_State_PlusLogo;
266
}
267
}
268
#endif
269
270
#if GAME_INCLUDE_EDITOR
271
void TitleLogo_EditorDraw(void)
272
{
273
RSDK_THIS(TitleLogo);
274
275
self->drawFX = FX_FLIP;
276
switch (self->type) {
277
case TITLELOGO_EMBLEM:
278
RSDK.SetSpriteAnimation(TitleLogo->aniFrames, 0, &self->mainAnimator, true, 0);
279
280
self->direction = FLIP_NONE;
281
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
282
283
self->direction = FLIP_X;
284
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
285
286
self->direction = FLIP_NONE;
287
break;
288
289
case TITLELOGO_RIBBON:
290
RSDK.SetSpriteAnimation(TitleLogo->aniFrames, 1, &self->mainAnimator, true, 0);
291
RSDK.SetSpriteAnimation(TitleLogo->aniFrames, 3, &self->ribbonCenterAnimator, true, 0);
292
293
self->direction = FLIP_X;
294
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
295
296
self->direction = FLIP_NONE;
297
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
298
299
RSDK.DrawSprite(&self->ribbonCenterAnimator, NULL, false);
300
break;
301
302
case TITLELOGO_PRESSSTART:
303
RSDK.SetSpriteAnimation(TitleLogo->aniFrames, 8, &self->mainAnimator, true, 0);
304
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
305
break;
306
307
#if MANIA_USE_PLUS
308
case TITLELOGO_PLUS:
309
RSDK.SetSpriteAnimation(TitleLogo->plusFrames, 0, &self->mainAnimator, true, 0);
310
311
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
312
break;
313
#endif
314
315
default:
316
RSDK.SetSpriteAnimation(TitleLogo->aniFrames, self->type + 2, &self->mainAnimator, true, 0);
317
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
318
break;
319
}
320
}
321
322
void TitleLogo_EditorLoad(void)
323
{
324
TitleLogo->aniFrames = RSDK.LoadSpriteAnimation("Title/Logo.bin", SCOPE_STAGE);
325
#if MANIA_USE_PLUS
326
TitleLogo->plusFrames = RSDK.LoadSpriteAnimation("Title/PlusLogo.bin", SCOPE_STAGE);
327
#endif
328
329
RSDK_ACTIVE_VAR(TitleLogo, type);
330
RSDK_ENUM_VAR("Emblem", TITLELOGO_EMBLEM);
331
RSDK_ENUM_VAR("Ribbon", TITLELOGO_RIBBON);
332
RSDK_ENUM_VAR("Game Title", TITLELOGO_GAMETITLE);
333
RSDK_ENUM_VAR("Power LED", TITLELOGO_POWERLED);
334
RSDK_ENUM_VAR("Copyright", TITLELOGO_COPYRIGHT);
335
RSDK_ENUM_VAR("Ring Bottom", TITLELOGO_RINGBOTTOM);
336
RSDK_ENUM_VAR("Press Start", TITLELOGO_PRESSSTART);
337
#if MANIA_USE_PLUS
338
RSDK_ENUM_VAR("Plus Logo", TITLELOGO_PLUS);
339
#endif
340
}
341
#endif
342
343
void TitleLogo_Serialize(void) { RSDK_EDITABLE_VAR(TitleLogo, VAR_ENUM, type); }
344
345