Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/OOZ/OOZ2Outro.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: OOZ2Outro 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
ObjectOOZ2Outro *OOZ2Outro;
12
13
void OOZ2Outro_Update(void)
14
{
15
RSDK_THIS(OOZ2Outro);
16
17
EntityMegaOctus *boss = MegaOctus->bossEntity;
18
if (globals->gameMode < MODE_TIMEATTACK && boss && !boss->classID) {
19
self->scrollOffset.x = self->moveOffset.x & 0xFFFF0000;
20
self->scrollOffset.y = self->moveOffset.y & 0xFFFF0000;
21
22
StateMachine_Run(self->state);
23
24
foreach_active(Player, player)
25
{
26
TileLayer *layer = self->moveLayer;
27
if (!player->sidekick) {
28
layer->scrollPos = -self->scrollOffset.y;
29
layer->scrollInfo[0].scrollPos = -self->scrollOffset.x;
30
}
31
32
player->collisionLayers |= Zone->moveLayerMask;
33
player->moveLayerPosition.x = -(int32)(self->moveOffset.x & 0xFFFF0000);
34
player->moveLayerPosition.y = -(int32)(self->moveOffset.y & 0xFFFF0000);
35
}
36
37
if (self->prisonPtr) {
38
self->prisonPtr->position.x = self->scrollOffset.x + self->prisonPos.x;
39
self->prisonPtr->position.y = self->scrollOffset.y + self->prisonPos.y;
40
}
41
}
42
}
43
44
void OOZ2Outro_LateUpdate(void) {}
45
46
void OOZ2Outro_StaticUpdate(void) {}
47
48
void OOZ2Outro_Draw(void) {}
49
50
void OOZ2Outro_Create(void *data)
51
{
52
RSDK_THIS(OOZ2Outro);
53
54
if (!SceneInfo->inEditor) {
55
if (globals->gameMode < MODE_TIMEATTACK) {
56
self->active = ACTIVE_BOUNDS;
57
self->visible = false;
58
59
if (!self->size.x)
60
self->size.x = WIDE_SCR_XSIZE << 16;
61
if (!self->size.y)
62
self->size.y = SCREEN_YSIZE << 16;
63
64
self->moveLayer = RSDK.GetTileLayer(Zone->moveLayer);
65
self->updateRange = self->size;
66
foreach_all(EggPrison, prison)
67
{
68
self->prisonPtr = prison;
69
self->prisonPos = prison->position;
70
}
71
72
self->state = OOZ2Outro_State_SubFloat;
73
}
74
else {
75
destroyEntity(self);
76
}
77
}
78
}
79
80
void OOZ2Outro_StageLoad(void)
81
{
82
OOZ2Outro->sfxGlug = RSDK.GetSfx("OOZ/Glug.wav");
83
OOZ2Outro->sfxSubLaunch = RSDK.GetSfx("OOZ/SubLaunch.wav");
84
}
85
86
void OOZ2Outro_StageFinish_EndAct2(void)
87
{
88
Zone->cameraBoundsR[0] = 0x4000;
89
foreach_active(Player, player)
90
{
91
player->state = Player_State_Air;
92
player->stateInput = StateMachine_None;
93
94
player->left = false;
95
player->right = true;
96
player->up = false;
97
player->down = false;
98
player->jumpPress = false;
99
player->jumpHold = false;
100
}
101
102
foreach_active(OOZ2Outro, outro) { outro->state = OOZ2Outro_State_BoardSub; }
103
104
HUD_MoveOut();
105
}
106
107
void OOZ2Outro_State_SubFloat(void)
108
{
109
RSDK_THIS(OOZ2Outro);
110
111
self->moveOffset.y = RSDK.Sin256(Zone->timer) << 10;
112
}
113
114
void OOZ2Outro_CheckSkip(void)
115
{
116
if (ControllerInfo->keyStart.press && (SceneInfo->state & ENGINESTATE_REGULAR)) {
117
globals->suppressTitlecard = false;
118
globals->suppressAutoMusic = false;
119
globals->enableIntro = false;
120
121
RSDK.SetEngineState(ENGINESTATE_FROZEN);
122
123
Zone_StartFadeOut(20, 0x000000);
124
Music_FadeOut(0.03);
125
}
126
}
127
128
void OOZ2Outro_State_BoardSub(void)
129
{
130
RSDK_THIS(OOZ2Outro);
131
132
OOZ2Outro_CheckSkip();
133
134
self->moveOffset.y = RSDK.Sin256(Zone->timer) << 10;
135
136
bool32 keepMoving = false;
137
foreach_active(Player, player)
138
{
139
player->jumpPress = false;
140
141
if (player->animator.animationID == ANI_PUSH) {
142
player->jumpPress = true;
143
player->jumpHold = true;
144
}
145
else if (player->velocity.y > -0x20000) {
146
player->jumpHold = false;
147
}
148
149
if (player->position.x > self->position.x - 0x100000 && player->velocity.x > 0x20000)
150
player->right = false;
151
152
if (player->position.x < self->position.x + 0x400000) {
153
if (!player->right) {
154
if (player->groundVel < 0x20000)
155
player->groundVel = 0x20000;
156
if (player->velocity.x < 0x20000)
157
player->velocity.x = 0x20000;
158
}
159
keepMoving |= true;
160
}
161
else {
162
player->groundVel = 0;
163
player->velocity.x = 0;
164
player->right = false;
165
}
166
}
167
168
if (!keepMoving)
169
++self->timer;
170
171
if (self->timer > 60) {
172
self->timer = 0;
173
self->state = OOZ2Outro_State_SubActivate;
174
175
foreach_active(Player, playerPtr)
176
{
177
playerPtr->groundVel = 0;
178
playerPtr->velocity.x = 0;
179
playerPtr->right = false;
180
playerPtr->state = Player_State_Static;
181
182
RSDK.SetSpriteAnimation(playerPtr->aniFrames, ANI_BALANCE_1, &playerPtr->animator, false, 0);
183
Zone->playerBoundActiveR[playerPtr->playerID] = 0;
184
185
EntityCamera *camera = playerPtr->camera;
186
if (camera)
187
camera->state = StateMachine_None;
188
}
189
}
190
}
191
192
void OOZ2Outro_State_SubActivate(void)
193
{
194
RSDK_THIS(OOZ2Outro);
195
196
OOZ2Outro_CheckSkip();
197
198
self->moveOffset.y -= 0x6000;
199
200
if (!(Zone->timer & 0xF)) {
201
Camera_ShakeScreen(0, 0, 4);
202
RSDK.PlaySfx(OOZ2Outro->sfxGlug, false, 255);
203
}
204
205
if (++self->timer == 140)
206
RSDK.PlaySfx(OOZ2Outro->sfxSubLaunch, false, 255);
207
208
if (self->timer > 180) {
209
self->timer = 0;
210
self->velocity.y = -0x30000;
211
self->state = OOZ2Outro_State_SubLaunch;
212
foreach_active(Player, player) { RSDK.SetSpriteAnimation(player->aniFrames, ANI_BALANCE_2, &player->animator, false, 0); }
213
}
214
}
215
216
void OOZ2Outro_State_SubLaunch(void)
217
{
218
RSDK_THIS(OOZ2Outro);
219
220
if (self->velocity.y < -0x8000)
221
self->velocity.y += 0x3800;
222
223
self->velocity.x += 0x1800;
224
225
self->moveOffset.x += self->velocity.x;
226
self->moveOffset.y += self->velocity.y;
227
228
foreach_active(Player, player) { player->position.x += self->velocity.x; }
229
230
if (++self->timer > 140) {
231
self->timer = 0;
232
self->state = 0;
233
Zone_StartFadeOut(10, 0x000000);
234
foreach_active(Player, playerPtr) { playerPtr->active = ACTIVE_NEVER; }
235
}
236
}
237
238
#if GAME_INCLUDE_EDITOR
239
void OOZ2Outro_EditorDraw(void)
240
{
241
RSDK_THIS(OOZ2Outro);
242
243
CutsceneRules_DrawCutsceneBounds(self, &self->size);
244
}
245
246
void OOZ2Outro_EditorLoad(void) {}
247
#endif
248
249
void OOZ2Outro_Serialize(void) { RSDK_EDITABLE_VAR(OOZ2Outro, VAR_VECTOR2, size); }
250
#endif
251
252