Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/Cutscene/FXFade.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: FXFade Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectFXFade *FXFade;
11
12
void FXFade_Update(void)
13
{
14
RSDK_THIS(FXFade);
15
16
StateMachine_Run(self->state);
17
}
18
19
void FXFade_LateUpdate(void) {}
20
21
void FXFade_StaticUpdate(void) {}
22
23
void FXFade_Draw(void)
24
{
25
RSDK_THIS(FXFade);
26
27
RSDK.FillScreen(self->color, self->timer, self->timer - 128, self->timer - 256);
28
}
29
30
void FXFade_Create(void *data)
31
{
32
RSDK_THIS(FXFade);
33
34
if (!SceneInfo->inEditor) {
35
self->visible = true;
36
self->active = ACTIVE_NORMAL;
37
38
if (RSDK.CheckSceneFolder("Menu"))
39
self->drawGroup = 14;
40
else if (Zone)
41
self->drawGroup = self->overHUD ? Zone->hudDrawGroup : Zone->hudDrawGroup - 1;
42
else
43
self->drawGroup = 15;
44
45
if (!self->speedIn)
46
self->speedIn = 32;
47
48
if (!self->speedOut)
49
self->speedOut = 32;
50
51
if (!self->color)
52
self->color = VOID_TO_INT(data);
53
54
if (!self->eventOnly) {
55
#if MANIA_USE_PLUS
56
self->transitionScene = false;
57
#endif
58
self->state = self->timer <= 0 ? FXFade_State_FadeOut : FXFade_State_FadeIn;
59
}
60
}
61
}
62
63
void FXFade_StageLoad(void) {}
64
65
void FXFade_StopAll(void)
66
{
67
foreach_all(FXFade, entity) { destroyEntity(entity); }
68
}
69
70
void FXFade_State_FadeOut(void)
71
{
72
RSDK_THIS(FXFade);
73
74
if (self->timer >= 512) {
75
if (self->oneWay) {
76
self->state = StateMachine_None;
77
78
#if MANIA_USE_PLUS
79
if (self->transitionScene)
80
RSDK.LoadScene();
81
#endif
82
}
83
else if (self->wait <= 0) {
84
self->state = self->fadeOutBlack ? FXFade_State_FadeInBlack : FXFade_State_FadeIn;
85
}
86
else {
87
self->state = FXFade_State_Wait;
88
}
89
}
90
else {
91
self->timer += self->speedIn;
92
}
93
}
94
void FXFade_State_Wait(void)
95
{
96
RSDK_THIS(FXFade);
97
98
if (--self->wait <= 0) {
99
self->state = self->fadeOutBlack ? FXFade_State_FadeInBlack : FXFade_State_FadeIn;
100
}
101
}
102
void FXFade_State_FadeIn(void)
103
{
104
RSDK_THIS(FXFade);
105
106
if (self->timer <= 0) {
107
if (self->oneWay)
108
self->state = StateMachine_None;
109
else
110
destroyEntity(self);
111
}
112
else {
113
self->timer -= self->speedOut;
114
}
115
}
116
void FXFade_State_FadeInBlack(void)
117
{
118
RSDK_THIS(FXFade);
119
120
int32 r = (self->color >> 16) & 0xFF;
121
int32 g = (self->color >> 8) & 0xFF;
122
int32 b = (self->color >> 0) & 0xFF;
123
124
if (r)
125
r -= self->speedOut;
126
else if (g)
127
g -= self->speedOut;
128
else if (b)
129
b -= self->speedOut;
130
else
131
self->state = StateMachine_None;
132
133
self->color = (MAX(r, 0) << 16) | (MAX(g, 0) << 8) | (MAX(b, 0) << 0);
134
}
135
136
#if GAME_INCLUDE_EDITOR
137
void FXFade_EditorDraw(void)
138
{
139
RSDK_THIS(FXFade);
140
141
RSDK.DrawRect(self->position.x - 0x100000, self->position.y - 0x100000, 0x200000, 0x200000, self->color, 0xFF, INK_NONE, false);
142
}
143
144
void FXFade_EditorLoad(void) {}
145
#endif
146
147
void FXFade_Serialize(void)
148
{
149
RSDK_EDITABLE_VAR(FXFade, VAR_ENUM, timer);
150
RSDK_EDITABLE_VAR(FXFade, VAR_ENUM, speedIn);
151
RSDK_EDITABLE_VAR(FXFade, VAR_ENUM, wait);
152
RSDK_EDITABLE_VAR(FXFade, VAR_ENUM, speedOut);
153
RSDK_EDITABLE_VAR(FXFade, VAR_COLOR, color);
154
RSDK_EDITABLE_VAR(FXFade, VAR_BOOL, oneWay);
155
RSDK_EDITABLE_VAR(FXFade, VAR_BOOL, eventOnly);
156
RSDK_EDITABLE_VAR(FXFade, VAR_BOOL, overHUD);
157
RSDK_EDITABLE_VAR(FXFade, VAR_BOOL, fadeOutBlack);
158
}
159
160