Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/Cutscene/CutsceneSeq.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: CutsceneSeq Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectCutsceneSeq *CutsceneSeq;
11
12
void CutsceneSeq_Update(void)
13
{
14
#if MANIA_USE_PLUS
15
RSDK_THIS(CutsceneSeq);
16
17
CutsceneSeq_CheckSkip(self->skipType, self, self->skipCallback);
18
#endif
19
}
20
21
void CutsceneSeq_LateUpdate(void)
22
{
23
RSDK_THIS(CutsceneSeq);
24
25
self->currentState = self->cutsceneStates[self->stateID];
26
if (self->currentState) {
27
SceneInfo->entity = self->activeEntity;
28
bool32 finishedState = self->currentState(self);
29
SceneInfo->entity = (Entity *)self;
30
31
++self->timer;
32
if (finishedState) {
33
LogHelpers_Print("State completed");
34
CutsceneSeq_NewState(self->stateID + 1, self);
35
}
36
37
if (!self->cutsceneStates[self->stateID]) {
38
LogHelpers_Print("Sequence completed");
39
destroyEntity(self);
40
}
41
}
42
43
self->visible = false;
44
for (int32 p = 0; p < CUTSCENESEQ_POINT_COUNT; ++p) {
45
if (self->points[p].x && self->points[p].y)
46
self->visible = true;
47
}
48
49
if (self->fadeWhite > 0 || self->fadeBlack > 0)
50
self->visible = true;
51
}
52
53
void CutsceneSeq_StaticUpdate(void) {}
54
55
void CutsceneSeq_Draw(void)
56
{
57
RSDK_THIS(CutsceneSeq);
58
59
color colors[CUTSCENESEQ_POINT_COUNT];
60
colors[0] = 0x00FF00;
61
colors[1] = 0xFF0000;
62
colors[2] = 0x0000FF;
63
colors[3] = 0xFF00FF;
64
colors[4] = 0xFFFF00;
65
colors[5] = 0x00FFFF;
66
colors[6] = 0x9933FF;
67
colors[7] = 0xFF9900;
68
69
for (int32 p = 0; p < CUTSCENESEQ_POINT_COUNT; ++p) {
70
Vector2 *point = &self->points[p];
71
if (point->x || point->y) {
72
#if MANIA_USE_PLUS
73
LogHelpers_PrintVector2("Draw poi ", *point);
74
#endif
75
DrawHelpers_DrawCross(point->x, point->y, TO_FIXED(32), TO_FIXED(32), colors[p]);
76
}
77
}
78
79
if (self->fadeWhite > 0)
80
RSDK.FillScreen(0xFFF0F0, self->fadeWhite, self->fadeWhite - 256, self->fadeWhite - 256);
81
82
if (self->fadeBlack > 0)
83
RSDK.FillScreen(0x000000, self->fadeBlack, self->fadeBlack - 128, self->fadeBlack - 256);
84
}
85
86
void CutsceneSeq_Create(void *data)
87
{
88
RSDK_THIS(CutsceneSeq);
89
90
self->active = ACTIVE_NORMAL;
91
self->visible = false;
92
self->fadeWhite = 0;
93
self->fadeBlack = 0;
94
self->drawGroup = Zone->hudDrawGroup + 1;
95
96
#if MANIA_USE_PLUS
97
CutsceneSeq_CheckSkip(self->skipType, self, self->skipCallback);
98
#endif
99
}
100
101
void CutsceneSeq_StageLoad(void) {}
102
103
void CutsceneSeq_NewState(int32 nextState, EntityCutsceneSeq *seq)
104
{
105
seq->stateID = nextState;
106
seq->timer = 0;
107
seq->storedTimer = 0;
108
109
for (int32 p = 0; p < CUTSCENESEQ_POINT_COUNT; ++p) {
110
seq->values[p] = 0;
111
seq->points[p].x = 0;
112
seq->points[p].y = 0;
113
}
114
}
115
#if MANIA_USE_PLUS
116
void CutsceneSeq_SetSkipType(uint8 type)
117
{
118
EntityCutsceneSeq *seq = RSDK_GET_ENTITY(SLOT_CUTSCENESEQ, CutsceneSeq);
119
if (seq->classID) {
120
seq->skipType = type;
121
}
122
}
123
124
void CutsceneSeq_SetSkipTypeCallback(void (*callback)(void))
125
{
126
EntityCutsceneSeq *seq = RSDK_GET_ENTITY(SLOT_CUTSCENESEQ, CutsceneSeq);
127
if (seq->classID) {
128
seq->skipType = SKIPTYPE_CALLBACK;
129
seq->skipCallback = callback;
130
}
131
}
132
133
void CutsceneSeq_CheckSkip(uint8 skipType, EntityCutsceneSeq *seq, void (*skipCallback)(void))
134
{
135
bool32 skipPress = ControllerInfo->keyStart.press;
136
137
if (skipType && skipPress && (SceneInfo->state & ENGINESTATE_REGULAR)) {
138
bool32 loadNewScene = false;
139
140
if (skipType == SKIPTYPE_NEXTSCENE) {
141
++SceneInfo->listPos;
142
loadNewScene = true;
143
}
144
else {
145
if (skipType == SKIPTYPE_CALLBACK) {
146
StateMachine_Run(skipCallback);
147
}
148
149
loadNewScene = seq && (seq->skipType == SKIPTYPE_CALLBACK || seq->skipType == SKIPTYPE_RELOADSCN);
150
}
151
152
if (loadNewScene) {
153
globals->suppressTitlecard = false;
154
globals->suppressAutoMusic = false;
155
globals->enableIntro = false;
156
157
RSDK.SetEngineState(ENGINESTATE_FROZEN);
158
159
Zone_StartFadeOut(20, 0x000000);
160
Music_FadeOut(0.03);
161
}
162
}
163
}
164
#endif
165
166
Entity *CutsceneSeq_GetEntity(int32 type)
167
{
168
foreach_all_type(type, entity) { foreach_return entity; }
169
170
return NULL;
171
}
172
173
void CutsceneSeq_LockPlayerControl(EntityPlayer *player)
174
{
175
player->up = false;
176
player->down = false;
177
player->left = false;
178
player->right = false;
179
player->jumpHold = false;
180
player->jumpPress = false;
181
182
Player->upState = 0;
183
Player->downState = 0;
184
Player->leftState = 0;
185
Player->rightState = 0;
186
Player->jumpPressState = 0;
187
Player->jumpHoldState = 0;
188
}
189
190
void CutsceneSeq_LockAllPlayerControl(void)
191
{
192
for (int32 p = 0; p < Player->playerCount; ++p) {
193
CutsceneSeq_LockPlayerControl(RSDK_GET_ENTITY(p, Player));
194
}
195
}
196
void CutsceneSeq_StartSequence(void *manager, ...)
197
{
198
if (RSDK_GET_ENTITY(SLOT_CUTSCENESEQ, CutsceneSeq)->classID)
199
return;
200
201
RSDK.ResetEntitySlot(SLOT_CUTSCENESEQ, CutsceneSeq->classID, NULL);
202
EntityCutsceneSeq *cutsceneSeq = RSDK_GET_ENTITY(SLOT_CUTSCENESEQ, CutsceneSeq);
203
204
cutsceneSeq->position.x = 0;
205
cutsceneSeq->position.y = 0;
206
cutsceneSeq->activeEntity = SceneInfo->entity;
207
cutsceneSeq->managerEntity = manager;
208
209
va_list list;
210
va_start(list, manager);
211
212
int32 count = 0;
213
for (count = 0;; ++count) {
214
void *state = va_arg(list, void *);
215
if (!state)
216
break;
217
218
LogHelpers_Print("state = %x", state);
219
cutsceneSeq->cutsceneStates[count] = (bool32(*)(EntityCutsceneSeq *))state;
220
}
221
va_end(list);
222
223
LogHelpers_Print("Starting sequence with %d states", count);
224
}
225
226
#if GAME_INCLUDE_EDITOR
227
void CutsceneSeq_EditorDraw(void) {}
228
229
void CutsceneSeq_EditorLoad(void) {}
230
#endif
231
232
void CutsceneSeq_Serialize(void) {}
233
234