Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/LRZ/LRZ1Outro.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: LRZ1Outro Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectLRZ1Outro *LRZ1Outro;
11
12
void LRZ1Outro_Update(void)
13
{
14
RSDK_THIS(LRZ1Outro);
15
16
LRZ1Outro_StartCutscene();
17
self->active = ACTIVE_NEVER;
18
}
19
20
void LRZ1Outro_LateUpdate(void) {}
21
22
void LRZ1Outro_StaticUpdate(void) {}
23
24
void LRZ1Outro_Draw(void) {}
25
26
void LRZ1Outro_Create(void *data)
27
{
28
RSDK_THIS(LRZ1Outro);
29
30
self->active = ACTIVE_NORMAL;
31
}
32
33
void LRZ1Outro_StageLoad(void) {}
34
35
void LRZ1Outro_StartCutscene(void)
36
{
37
RSDK_THIS(LRZ1Outro);
38
39
if (Zone->actID) {
40
CutsceneSeq_StartSequence(self, LRZ1Outro_CutsceneAct2_SetupActors, LRZ1Outro_CutsceneAct2_UsingDashLift, LRZ1Outro_CutsceneAct2_ExitDashLift,
41
StateMachine_None);
42
}
43
else {
44
CutsceneSeq_StartSequence(self, LRZ1Outro_CutsceneAct1_SetupActors, LRZ1Outro_CutsceneAct1_SetupDashLift, LRZ1Outro_CutsceneAct1_GoToDashLift,
45
LRZ1Outro_CutsceneAct1_UsingDashLift, StateMachine_None);
46
}
47
48
#if MANIA_USE_PLUS
49
CutsceneSeq_SetSkipType(SKIPTYPE_RELOADSCN);
50
#endif
51
52
for (int32 i = 0; i < 0x100; ++i) RSDK.SetPaletteEntry(5, i, 0x000000);
53
}
54
55
bool32 LRZ1Outro_CutsceneAct1_SetupActors(EntityCutsceneSeq *host)
56
{
57
CutsceneSeq_LockAllPlayerControl();
58
59
foreach_active(Player, player)
60
{
61
player->state = Player_State_Ground;
62
player->stateInput = StateMachine_None;
63
}
64
65
Vector2 size;
66
RSDK.GetLayerSize(Zone->fgLayer[0], &size, true);
67
68
for (int32 p = 0; p < Player->playerCount; ++p) Zone->cameraBoundsR[p] = size.x;
69
70
return true;
71
}
72
73
bool32 LRZ1Outro_CutsceneAct2_SetupActors(EntityCutsceneSeq *host)
74
{
75
RSDK_THIS(LRZ1Outro);
76
77
foreach_all(Player, player)
78
{
79
player->onGround = true;
80
player->groundedStore = true;
81
player->direction = FLIP_X;
82
RSDK.SetSpriteAnimation(player->aniFrames, ANI_SPINDASH, &player->animator, true, 0);
83
player->state = Player_State_Spindash;
84
player->stateInput = StateMachine_None;
85
player->down = true;
86
87
if (player->camera) {
88
player->camera->position.x = player->position.x;
89
player->camera->position.y = player->position.y;
90
player->camera->offset.x = 0;
91
player->camera->offset.y = 0;
92
}
93
}
94
95
foreach_all(DashLift, lift) { self->lift = lift; }
96
97
self->timer = 256;
98
RSDK.SetLimitedFade(0, 1, 5, 0x100, 128, 256);
99
LRZ2Setup->conveyorPalTimer = 0;
100
101
return true;
102
}
103
104
bool32 LRZ1Outro_CutsceneAct1_SetupDashLift(EntityCutsceneSeq *host)
105
{
106
RSDK_THIS(LRZ1Outro);
107
108
foreach_active(Player, player)
109
{
110
player->left = false;
111
player->right = true;
112
player->jumpPress = false;
113
player->jumpHold = true;
114
115
if (player->onGround) {
116
if (player->animator.animationID == ANI_PUSH)
117
player->jumpPress = true;
118
119
if (!RSDK.ObjectTileCollision(player, player->collisionLayers, CMODE_FLOOR, 0, 0x100000, 0x160000, false))
120
player->jumpPress = true;
121
}
122
}
123
124
self->lift = NULL;
125
foreach_active(DashLift, lift) { self->lift = lift; }
126
127
return RSDK.GetEntityCount(DashLift->classID, true) > 0;
128
}
129
130
bool32 LRZ1Outro_CutsceneAct1_GoToDashLift(EntityCutsceneSeq *host)
131
{
132
RSDK_THIS(LRZ1Outro);
133
134
EntityDashLift *lift = self->lift;
135
136
foreach_active(Player, player)
137
{
138
player->jumpHold = false;
139
player->jumpPress = false;
140
141
if (player->animator.animationID == ANI_PUSH)
142
player->jumpPress = true;
143
144
if (lift->position.x - player->position.x < 0x600000 && player->right && player->onGround)
145
player->jumpPress = true;
146
147
if (player->position.x >= lift->position.x) {
148
player->position.x = lift->position.x;
149
player->velocity.x = 0;
150
player->groundVel = 0;
151
player->right = false;
152
player->direction = FLIP_X;
153
154
if (!self->timer && !player->sidekick)
155
self->timer = 1;
156
}
157
}
158
159
if (self->timer > 0)
160
self->timer++;
161
162
if (self->timer >= 60) {
163
foreach_active(Player, playerPtr)
164
{
165
playerPtr->jumpHold = false;
166
playerPtr->jumpPress = false;
167
playerPtr->down = true;
168
}
169
170
RSDK.CopyPalette(0, 128, 1, 128, 128);
171
return true;
172
}
173
174
return false;
175
}
176
177
bool32 LRZ1Outro_CutsceneAct1_UsingDashLift(EntityCutsceneSeq *host)
178
{
179
RSDK_THIS(LRZ1Outro);
180
181
EntityDashLift *lift = self->lift;
182
183
foreach_active(Player, player)
184
{
185
player->jumpPress = false;
186
if (!(Zone->timer & 0xF) && host->timer < 60)
187
player->jumpPress = true;
188
189
if (player->camera) {
190
player->camera->offset.x >>= 1;
191
player->camera->offset.y >>= 1;
192
}
193
}
194
195
if (host->timer > 120) {
196
self->timer += 2;
197
RSDK.SetLimitedFade(0, 1, 5, self->timer, 128, 256);
198
199
if (self->timer > 256) {
200
globals->suppressTitlecard = true;
201
globals->suppressAutoMusic = true;
202
203
Zone_StoreEntities(lift->position.x, lift->position.y);
204
RSDK.LoadScene();
205
206
return true;
207
}
208
}
209
return false;
210
}
211
212
bool32 LRZ1Outro_CutsceneAct2_UsingDashLift(EntityCutsceneSeq *host)
213
{
214
RSDK_THIS(LRZ1Outro);
215
216
EntityDashLift *lift = self->lift;
217
218
foreach_active(Player, playerPtr)
219
{
220
playerPtr->jumpPress = false;
221
if (!(Zone->timer & 0xF) && host->timer < 60)
222
playerPtr->jumpPress = true;
223
}
224
225
if (lift->drawPos.y < lift->amplitude.y) {
226
if (self->timer > 0)
227
self->timer -= 2;
228
229
RSDK.SetLimitedFade(0, 1, 5, self->timer, 128, 256);
230
231
LRZ2Setup->conveyorPalTimer = 0;
232
}
233
else {
234
foreach_active(Player, player)
235
{
236
player->onGround = false;
237
player->down = false;
238
player->jumpPress = false;
239
player->direction = FLIP_NONE;
240
player->velocity.x = 0x20000;
241
player->groundVel = 0x20000;
242
player->velocity.y = -0x50000;
243
player->state = Player_State_Air;
244
245
RSDK.SetSpriteAnimation(player->aniFrames, ANI_JUMP, &player->animator, true, 0);
246
}
247
248
return true;
249
}
250
251
return false;
252
}
253
254
bool32 LRZ1Outro_CutsceneAct2_ExitDashLift(EntityCutsceneSeq *host)
255
{
256
bool32 landedOnGround = true;
257
258
foreach_active(Player, player)
259
{
260
if (player->onGround) {
261
player->velocity.x = 0;
262
player->groundVel = 0;
263
}
264
else {
265
player->velocity.x = 0x20000;
266
landedOnGround = false;
267
}
268
}
269
270
if (landedOnGround) {
271
foreach_active(Player, playerPtr)
272
{
273
if (!playerPtr->sidekick)
274
playerPtr->stateInput = Player_Input_P1;
275
else
276
playerPtr->stateInput = Player_Input_P2_AI;
277
}
278
279
foreach_all(TitleCard, titleCard)
280
{
281
titleCard->active = ACTIVE_NORMAL;
282
titleCard->state = TitleCard_State_SetupBGElements;
283
titleCard->stateDraw = TitleCard_Draw_SlideIn;
284
foreach_break;
285
}
286
287
globals->suppressAutoMusic = false;
288
Music_PlayTrack(TRACK_STAGE);
289
290
return true;
291
}
292
293
return false;
294
}
295
296
#if GAME_INCLUDE_EDITOR
297
void LRZ1Outro_EditorDraw(void) {}
298
299
void LRZ1Outro_EditorLoad(void) {}
300
#endif
301
302
void LRZ1Outro_Serialize(void) {}
303
304