Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/LRZ/LRZ3OutroK.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: LRZ3OutroK Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectLRZ3OutroK *LRZ3OutroK;
11
12
void LRZ3OutroK_Update(void)
13
{
14
RSDK_THIS(LRZ3OutroK);
15
16
if (!self->activated) {
17
LRZ3OutroK_StartCutscene();
18
19
self->activated = true;
20
}
21
}
22
23
void LRZ3OutroK_LateUpdate(void) {}
24
25
void LRZ3OutroK_StaticUpdate(void) {}
26
27
void LRZ3OutroK_Draw(void) {}
28
29
void LRZ3OutroK_Create(void *data)
30
{
31
RSDK_THIS(LRZ3OutroK);
32
33
INIT_ENTITY(self);
34
CutsceneRules_SetupEntity(self, &self->size, &self->hitbox);
35
self->active = ACTIVE_NEVER;
36
}
37
38
void LRZ3OutroK_StageLoad(void)
39
{
40
foreach_all(EggPrison, prison)
41
{
42
LRZ3OutroK->prison = prison;
43
foreach_break;
44
}
45
46
foreach_all(SkyTeleporter, teleporter)
47
{
48
LRZ3OutroK->teleporter = teleporter;
49
foreach_break;
50
}
51
52
foreach_all(FXRuby, fxRuby)
53
{
54
LRZ3OutroK->fxRuby = fxRuby;
55
foreach_break;
56
}
57
58
LRZ3OutroK->sfxWarp = RSDK.GetSfx("LRZ/Warp.wav");
59
}
60
61
void LRZ3OutroK_StartCutscene(void)
62
{
63
RSDK_THIS(MSZCutsceneK);
64
65
CutsceneSeq_StartSequence(self, LRZ3OutroK_Cutscene_RunToTeleporter, LRZ3OutroK_Cutscene_LandOnTeleporter, LRZ3OutroK_Cutscene_UseTeleporter,
66
LRZ3OutroK_Cutscene_TeleporterActivated, StateMachine_None);
67
68
#if MANIA_USE_PLUS
69
CutsceneSeq_SetSkipType(SKIPTYPE_RELOADSCN);
70
#endif
71
72
HUD_MoveOut();
73
}
74
75
bool32 LRZ3OutroK_Cutscene_RunToTeleporter(EntityCutsceneSeq *host)
76
{
77
RSDK_THIS(LRZ3OutroK);
78
79
MANIA_GET_PLAYER(player1, player2, camera);
80
UNUSED(camera);
81
82
EntitySkyTeleporter *teleporter = LRZ3OutroK->teleporter;
83
84
Vector2 size;
85
RSDK.GetLayerSize(Zone->fgLayer[0], &size, true);
86
if (!host->timer) {
87
LRZ3OutroK->prison->notSolid = true;
88
89
Zone->cameraBoundsT[0] = 0;
90
Zone->cameraBoundsT[1] = 0;
91
Zone->cameraBoundsR[0] = (self->position.x + self->size.x) >> 16;
92
Zone->cameraBoundsR[1] = (self->position.x + self->size.x) >> 16;
93
94
Zone->playerBoundActiveR[0] = false;
95
Zone->playerBoundActiveR[1] = false;
96
97
CutsceneSeq_LockAllPlayerControl();
98
99
player1->stateInput = StateMachine_None;
100
player1->state = Player_State_Ground;
101
player1->groundVel = 0;
102
player1->right = true;
103
104
if (player2->classID == Player->classID) {
105
player2->state = Player_State_Ground;
106
player2->stateInput = Player_Input_P2_AI;
107
player2->groundVel = 0;
108
}
109
}
110
111
if (player1->jumpPress)
112
player1->jumpPress = false;
113
114
if (player1->onGround && player1->position.x >= teleporter->position.x - 0x500000 && !host->values[0]) {
115
player1->jumpPress = true;
116
host->values[0] = true;
117
return true;
118
}
119
120
return false;
121
}
122
123
bool32 LRZ3OutroK_Cutscene_LandOnTeleporter(EntityCutsceneSeq *host)
124
{
125
MANIA_GET_PLAYER(player1, player2, camera);
126
UNUSED(camera);
127
128
if (player1->jumpPress)
129
player1->jumpPress = false;
130
131
if (player1->onGround) {
132
CutsceneSeq_LockPlayerControl(player1);
133
if (player2->classID == Player->classID && player2->onGround)
134
CutsceneSeq_LockPlayerControl(player2);
135
136
return true;
137
}
138
139
return false;
140
}
141
142
bool32 LRZ3OutroK_Cutscene_UseTeleporter(EntityCutsceneSeq *host)
143
{
144
RSDK_THIS(LRZ3OutroK);
145
146
EntitySkyTeleporter *teleporter = LRZ3OutroK->teleporter;
147
148
if (host->timer == 30) {
149
foreach_active(Player, player)
150
{
151
player->state = Player_State_Static;
152
player->nextGroundState = StateMachine_None;
153
player->nextAirState = StateMachine_None;
154
155
RSDK.SetSpriteAnimation(SkyTeleporter->aniFrames, 1, &teleporter->animator, true, 0);
156
157
if (player->characterID == ID_KNUCKLES)
158
RSDK.SetSpriteAnimation(player->aniFrames, ANI_GLIDE_DROP, &player->animator, true, 3);
159
else
160
RSDK.SetSpriteAnimation(player->aniFrames, ANI_SPRING_DIAGONAL, &player->animator, false, 0);
161
162
self->playerPos[player->playerID].x = player->position.x;
163
self->playerPos[player->playerID].y = player->position.y;
164
}
165
166
RSDK.PlaySfx(LRZ3OutroK->sfxWarp, false, 255);
167
}
168
169
if (host->timer == 60) {
170
foreach_active(Player, player) { RSDK.SetSpriteAnimation(player->aniFrames, ANI_SPRING_TWIRL, &player->animator, false, 3); }
171
}
172
173
int32 x = teleporter->position.x;
174
int32 y = teleporter->position.y - 0x740000;
175
176
if (host->timer >= 30) {
177
int32 angle = 255 * (host->timer - 30) / 60;
178
179
foreach_active(Player, player)
180
{
181
if (angle <= 0) {
182
player->position.x = self->playerPos[player->playerID].x;
183
player->position.y = self->playerPos[player->playerID].y;
184
}
185
else {
186
if (angle < 0x100) {
187
player->position.x = self->playerPos[player->playerID].x;
188
player->position.y = self->playerPos[player->playerID].y;
189
player->position.x += ((RSDK.Sin512(angle + 0x180) >> 2) + 0x80) * ((x - self->playerPos[player->playerID].x) >> 8);
190
player->position.y += ((RSDK.Sin512(angle + 0x180) >> 2) + 0x80) * ((y - self->playerPos[player->playerID].y) >> 8);
191
}
192
else {
193
player->position.x = x;
194
player->position.y = y;
195
}
196
}
197
198
player->position.x &= 0xFFFF0000;
199
player->position.y &= 0xFFFF0000;
200
}
201
202
if (teleporter->timer < 64)
203
teleporter->timer += 2;
204
}
205
206
if (host->timer == 90) {
207
foreach_active(Player, player)
208
{
209
player->position.x = x;
210
player->position.y = y;
211
}
212
213
return true;
214
}
215
216
return false;
217
}
218
219
bool32 LRZ3OutroK_Cutscene_TeleporterActivated(EntityCutsceneSeq *host)
220
{
221
if (host->timer >= 60) {
222
if (host->timer == 60)
223
RSDK.PlaySfx(LRZ3OutroK->sfxWarp, false, 255);
224
225
if (LRZ3OutroK->fxRuby->fadeWhite >= 512) {
226
if (LRZ3OutroK->fxRuby->fadeBlack < 512)
227
LRZ3OutroK->fxRuby->fadeBlack += 16;
228
}
229
else {
230
LRZ3OutroK->fxRuby->fadeWhite += 16;
231
}
232
233
if (host->timer == 180) {
234
RSDK.LoadScene();
235
return true;
236
}
237
}
238
239
return false;
240
}
241
242
#if GAME_INCLUDE_EDITOR
243
void LRZ3OutroK_EditorDraw(void)
244
{
245
RSDK_THIS(LRZ3OutroK);
246
247
CutsceneRules_DrawCutsceneBounds(self, &self->size);
248
}
249
250
void LRZ3OutroK_EditorLoad(void) {}
251
#endif
252
253
void LRZ3OutroK_Serialize(void) { RSDK_EDITABLE_VAR(LRZ3OutroK, VAR_VECTOR2, size); }
254
255