Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/TMZ/TMZ1Outro.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: TMZ1Outro Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectTMZ1Outro *TMZ1Outro;
11
12
void TMZ1Outro_Update(void)
13
{
14
RSDK_THIS(TMZ1Outro);
15
16
if (Zone->actID) {
17
CutsceneSeq_StartSequence(self, TMZ1Outro_CutsceneAct2_BeginAct2, StateMachine_None);
18
RSDK.SetLimitedFade(0, 5, 4, self->alpha, 128, 256);
19
}
20
else {
21
CutsceneSeq_StartSequence(self, TMZ1Outro_CutsceneAct1_SetupPlayers, TMZ1Outro_CutsceneAct1_ElevatorRide,
22
TMZ1Outro_CutsceneAct1_HeadForEntrance, TMZ1Outro_CutsceneAct1_EnterMonarch, StateMachine_None);
23
}
24
25
#if MANIA_USE_PLUS
26
CutsceneSeq_SetSkipType(SKIPTYPE_RELOADSCN);
27
#endif
28
29
self->active = ACTIVE_NEVER;
30
}
31
32
void TMZ1Outro_LateUpdate(void) {}
33
34
void TMZ1Outro_StaticUpdate(void) {}
35
36
void TMZ1Outro_Draw(void) {}
37
38
void TMZ1Outro_Create(void *data)
39
{
40
RSDK_THIS(TMZ1Outro);
41
42
if (!SceneInfo->inEditor) {
43
self->active = ACTIVE_NORMAL;
44
self->visible = false;
45
}
46
}
47
48
void TMZ1Outro_StageLoad(void) {}
49
50
bool32 TMZ1Outro_CutsceneAct1_SetupPlayers(EntityCutsceneSeq *host)
51
{
52
CutsceneSeq_LockAllPlayerControl();
53
54
foreach_active(Player, player)
55
{
56
player->state = Player_State_Ground;
57
player->stateInput = StateMachine_None;
58
}
59
60
return true;
61
}
62
63
bool32 TMZ1Outro_CutsceneAct1_ElevatorRide(EntityCutsceneSeq *host)
64
{
65
if (host->timer == 120) {
66
CrimsonEye_SetArrowDir(CE_ARROW_UP);
67
RSDK.PlaySfx(CrimsonEye->sfxBeep, false, 255);
68
}
69
70
if (host->timer == 160) {
71
Camera_ShakeScreen(0, 0, 6);
72
CrimsonEye->targetElevatorSpeed = -0x10000;
73
TileLayer *moveLayer = RSDK.GetTileLayer(Zone->moveLayer);
74
moveLayer->drawGroup[0] = 0;
75
moveLayer->scrollPos = 0x5000000;
76
moveLayer->scrollInfo[0].scrollPos = -0x4D00000;
77
RSDK.PlaySfx(CrimsonEye->sfxHullClose, false, 255);
78
}
79
80
if (host->timer > 160 && !(host->timer & 0x3F))
81
RSDK.PlaySfx(CrimsonEye->sfxElevator, false, 255);
82
83
if (host->timer > 200) {
84
if (CrimsonEye->targetElevatorSpeed) {
85
if (RSDK.GetTileLayer(Zone->moveLayer)->scrollPos < 0x2300000)
86
CrimsonEye->targetElevatorSpeed = 0;
87
}
88
else if (!CrimsonEye->elevatorSpeed) {
89
Camera_ShakeScreen(0, 0, 6);
90
RSDK.PlaySfx(CrimsonEye->sfxHullClose, false, 0xFF);
91
return true;
92
}
93
}
94
95
foreach_active(ItemBox, itembox)
96
{
97
// NOTE:
98
// broken monitors are carried up due to the differences how they work compared to unbroken ones
99
// unbroken monitors do not do any collision/gravity checks, so they're moved offscreen as expected
100
// however, unbroken monitors DO do gravity & collision, so the elevator collision overrides the code here and allows em to be carried into
101
// act 2
102
itembox->position.y -= CrimsonEye->targetElevatorSpeed;
103
}
104
105
foreach_active(SignPost, signPost) { signPost->position.y -= CrimsonEye->targetElevatorSpeed; }
106
107
return false;
108
}
109
110
bool32 TMZ1Outro_CutsceneAct1_HeadForEntrance(EntityCutsceneSeq *host)
111
{
112
RSDK_THIS(TMZ1Outro);
113
114
if (host->timer >= 30) {
115
bool32 finishedMoving = true;
116
117
foreach_active(Player, player)
118
{
119
if (abs(self->position.x - player->position.x) >= 0x100000) {
120
if (player->position.x > self->position.x) {
121
player->left = true;
122
finishedMoving = false;
123
}
124
125
if (player->position.x < self->position.x) {
126
player->right = true;
127
finishedMoving = false;
128
}
129
}
130
else {
131
player->left = false;
132
player->right = false;
133
player->groundVel -= player->groundVel >> 3;
134
player->velocity.x -= player->velocity.x >> 3;
135
player->direction = FLIP_NONE;
136
}
137
138
player->jumpPress = false;
139
player->jumpHold = true;
140
141
if (player->animator.animationID == ANI_PUSH)
142
player->jumpPress = true;
143
144
if (!player->onGround || player->velocity.x)
145
finishedMoving = false;
146
}
147
148
return finishedMoving;
149
}
150
return false;
151
}
152
153
bool32 TMZ1Outro_CutsceneAct1_EnterMonarch(EntityCutsceneSeq *host)
154
{
155
RSDK_THIS(TMZ1Outro);
156
157
self->alpha += 4;
158
RSDK.SetLimitedFade(0, 3, 5, self->alpha, 128, 256);
159
160
EntityCamera *camera = RSDK_GET_ENTITY(SLOT_CAMERA1, Camera);
161
if (camera->offset.x > 0)
162
camera->offset.x -= 0x10000;
163
164
if (self->alpha == 320) {
165
globals->suppressTitlecard = true;
166
globals->suppressAutoMusic = true;
167
168
Zone_StoreEntities((ScreenInfo->position.x + ScreenInfo->center.x) << 16, (ScreenInfo->size.y + ScreenInfo->position.y) << 16);
169
RSDK.LoadScene();
170
171
return true;
172
}
173
174
return false;
175
}
176
177
bool32 TMZ1Outro_CutsceneAct2_BeginAct2(EntityCutsceneSeq *host)
178
{
179
RSDK_THIS(TMZ1Outro);
180
181
self->alpha += 4;
182
RSDK.SetLimitedFade(0, 5, 4, self->alpha, 128, 256);
183
184
if (self->alpha >= 0x100) {
185
foreach_all(TitleCard, titleCard)
186
{
187
titleCard->active = ACTIVE_NORMAL;
188
titleCard->state = TitleCard_State_SetupBGElements;
189
titleCard->stateDraw = TitleCard_Draw_SlideIn;
190
191
globals->suppressAutoMusic = false;
192
Music_PlayTrack(TRACK_STAGE);
193
foreach_break;
194
}
195
196
return true;
197
}
198
199
return false;
200
}
201
202
#if GAME_INCLUDE_EDITOR
203
void TMZ1Outro_EditorDraw(void)
204
{
205
RSDK_THIS(TMZ1Outro);
206
207
CutsceneRules_DrawCutsceneBounds(self, &self->size);
208
}
209
210
void TMZ1Outro_EditorLoad(void) {}
211
#endif
212
213
void TMZ1Outro_Serialize(void) { RSDK_EDITABLE_VAR(TMZ1Outro, VAR_VECTOR2, size); }
214
215