Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/MMZ/MMZ2Outro.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: MMZ2Outro Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
#if MANIA_USE_PLUS
11
ObjectMMZ2Outro *MMZ2Outro;
12
13
void MMZ2Outro_Update(void)
14
{
15
RSDK_THIS(MMZ2Outro);
16
17
MMZ2Outro_StartCutscene();
18
self->active = ACTIVE_NEVER;
19
}
20
21
void MMZ2Outro_LateUpdate(void) {}
22
23
void MMZ2Outro_StaticUpdate(void) {}
24
25
void MMZ2Outro_Draw(void) {}
26
27
void MMZ2Outro_Create(void *data)
28
{
29
RSDK_THIS(MMZ2Outro);
30
self->active = ACTIVE_NORMAL;
31
self->isPermanent = true;
32
}
33
34
void MMZ2Outro_StageLoad(void)
35
{
36
MMZ2Outro->sfxThunda = RSDK.GetSfx("MMZ/ThundaVerb.wav");
37
MMZ2Outro->sfxLightsOut = RSDK.GetSfx("MMZ/LightsOut.wav");
38
MMZ2Outro->sfxTMZEyes = RSDK.GetSfx("MMZ/TMZEyes.wav");
39
}
40
41
void MMZ2Outro_StartCutscene(void)
42
{
43
RSDK_THIS(MMZ2Outro);
44
45
CutsceneSeq_StartSequence(self, MMZ2Outro_Cutscene_PowerDown, MMZ2Outro_Cutscene_Rumble, MMZ2Outro_Cutscene_CameraMoveToWindow,
46
MMZ2Outro_Cutscene_PlayerMoveToWindow, MMZ2Outro_Cutscene_EnterMonarchEyes, MMZ2Outro_Cutscene_ViewMonarch,
47
StateMachine_None);
48
49
#if MANIA_USE_PLUS
50
CutsceneSeq_SetSkipType(SKIPTYPE_RELOADSCN);
51
#endif
52
53
RSDK.CopyPalette(0, 1, 1, 1, 0xFF);
54
55
for (int32 i = 128; i < 256; ++i) RSDK.SetPaletteEntry(2, i, 0x000000);
56
for (int32 i = 0; i < 256; ++i) RSDK.SetPaletteEntry(5, i, 0xFFFFFF);
57
58
RSDK.GetTileLayer(0)->drawGroup[0] = DRAWGROUP_COUNT;
59
RSDK.GetTileLayer(1)->drawGroup[0] = DRAWGROUP_COUNT;
60
RSDK.GetTileLayer(2)->drawGroup[0] = 0;
61
RSDK.GetTileLayer(3)->drawGroup[0] = 0;
62
RSDK.GetTileLayer(4)->drawGroup[0] = 0;
63
64
HUD_MoveOut();
65
}
66
67
bool32 MMZ2Outro_Cutscene_PowerDown(EntityCutsceneSeq *host)
68
{
69
RSDK_THIS(MMZ2Outro);
70
71
if (++self->timer == 60) {
72
self->timer = 0;
73
Camera_ShakeScreen(0, 0, 4);
74
75
foreach_active(Player, player)
76
{
77
player->stateInput = StateMachine_None;
78
79
if (player->onGround) {
80
player->state = Player_State_Static;
81
RSDK.SetSpriteAnimation(player->aniFrames, ANI_BALANCE_1, &player->animator, false, 0);
82
}
83
else {
84
player->state = Player_State_Air;
85
player->velocity.x = 0;
86
}
87
}
88
89
RSDK.PlaySfx(MMZ2Outro->sfxLightsOut, false, 0xFF);
90
Zone->cameraBoundsT[0] = 0;
91
92
return true;
93
}
94
95
return false;
96
}
97
98
bool32 MMZ2Outro_Cutscene_Rumble(EntityCutsceneSeq *host)
99
{
100
RSDK_THIS(MMZ2Outro);
101
102
self->timer += 16;
103
if (self->timer <= 128)
104
RSDK.SetLimitedFade(0, 1, 2, self->timer, 128, 224);
105
106
RSDK.SetLimitedFade(0, 1, 2, self->timer, 224, 256);
107
if (self->timer == 1024) {
108
self->timer = -256;
109
foreach_active(Player, player) { player->state = Player_State_Ground; }
110
return true;
111
}
112
else {
113
foreach_active(Player, player)
114
{
115
if (player->onGround && player->state != Player_State_Static) {
116
player->state = Player_State_Static;
117
player->groundVel = 0;
118
RSDK.SetSpriteAnimation(player->aniFrames, ANI_BALANCE_1, &player->animator, false, 0);
119
}
120
}
121
}
122
123
return false;
124
}
125
126
bool32 MMZ2Outro_Cutscene_CameraMoveToWindow(EntityCutsceneSeq *host)
127
{
128
RSDK_THIS(MMZ2Outro);
129
130
CutsceneSeq_LockAllPlayerControl();
131
132
foreach_active(Player, player)
133
{
134
player->state = Player_State_Ground;
135
player->right = true;
136
player->groundVel = 1;
137
138
if (player->camera) {
139
player->camera->boundsR += 0x240;
140
player->camera = NULL;
141
}
142
}
143
144
for (int32 p = 0; p < Player->playerCount; ++p) {
145
Zone->cameraBoundsR[p] += 0x240;
146
Zone->playerBoundsR[p] += 0x2400000;
147
}
148
149
self->position.x = (Zone->cameraBoundsR[0] - ScreenInfo->center.x) << 16;
150
self->position.y = (Zone->cameraBoundsB[0] - ScreenInfo->center.y) << 16;
151
152
RSDK_GET_ENTITY(SLOT_CAMERA1, Camera)->position.x = (ScreenInfo->position.x + ScreenInfo->center.x) << 16;
153
Camera_SetupLerp(CAMERA_LERP_SIN512, 0, self->position.x, self->position.y, 2);
154
155
return true;
156
}
157
158
bool32 MMZ2Outro_Cutscene_PlayerMoveToWindow(EntityCutsceneSeq *host)
159
{
160
RSDK_THIS(MMZ2Outro);
161
162
bool32 finished = true;
163
164
foreach_active(Player, player)
165
{
166
player->jumpPress = false;
167
168
if (player->animator.animationID == ANI_PUSH) {
169
player->jumpPress = true;
170
player->jumpHold = true;
171
}
172
else if (player->velocity.y > 0x20000) {
173
player->jumpHold = false;
174
}
175
176
if (player->groundVel > 0x40000)
177
player->groundVel = 0x40000;
178
179
if (player->position.x <= self->position.x - 0x180000 * player->playerID - 0x200000) {
180
finished = false;
181
}
182
else {
183
player->groundVel = 0;
184
player->right = false;
185
}
186
}
187
188
return finished;
189
}
190
191
bool32 MMZ2Outro_Cutscene_EnterMonarchEyes(EntityCutsceneSeq *host)
192
{
193
RSDK_THIS(MMZ2Outro);
194
195
self->timer += 8;
196
RSDK.SetLimitedFade(0, 2, 1, self->timer, 231, 234);
197
198
if (self->timer == 256)
199
RSDK.PlaySfx(MMZ2Outro->sfxTMZEyes, false, 255);
200
201
if (self->timer == 512) {
202
foreach_active(Player, player) { player->up = true; }
203
}
204
205
if (self->timer == 768) {
206
self->timer = 0;
207
self->flashTimer = 0;
208
return true;
209
}
210
211
return false;
212
}
213
214
bool32 MMZ2Outro_Cutscene_ViewMonarch(EntityCutsceneSeq *host)
215
{
216
RSDK_THIS(MMZ2Outro);
217
218
if (--self->flashTimer <= 0) {
219
CREATE_ENTITY(MMZLightning, MMZLightning_State_BeginFadeIn, 0, 0);
220
CREATE_ENTITY(MMZLightning, MMZLightning_State_SetupLightningBig, 0, 0);
221
222
RSDK.PlaySfx(MMZ2Outro->sfxThunda, false, 255);
223
self->flashTimer = RSDK.Rand(120, 240);
224
225
foreach_active(Player, player)
226
{
227
if (player->characterID == ID_TAILS) {
228
player->state = Player_State_Air;
229
player->onGround = false;
230
player->velocity.y = -0x30000;
231
RSDK.SetSpriteAnimation(player->aniFrames, ANI_HURT, &player->animator, false, 0);
232
}
233
}
234
}
235
236
if ((self->timer & 7) == 4 && self->flashTimer < 48)
237
CREATE_ENTITY(MMZLightning, MMZLightning_State_SetupLightningSmall, 0, 0);
238
239
if (++self->timer == 120) {
240
EntityCamera *camera = RSDK_GET_ENTITY(SLOT_CAMERA1, Camera);
241
Camera_SetupLerp(CAMERA_LERP_SIN512, 0, camera->position.x, camera->position.y - 0x1000000, 1);
242
}
243
244
if (self->timer == 600) {
245
Zone_StartFadeOut(10, 0x000000);
246
return true;
247
}
248
249
return false;
250
}
251
252
#if GAME_INCLUDE_EDITOR
253
void MMZ2Outro_EditorDraw(void) {}
254
255
void MMZ2Outro_EditorLoad(void) {}
256
#endif
257
258
void MMZ2Outro_Serialize(void) {}
259
#endif
260
261