Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/MSZ/MSZ2Cutscene.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: MSZ2Cutscene Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectMSZ2Cutscene *MSZ2Cutscene;
11
12
void MSZ2Cutscene_Update(void)
13
{
14
RSDK_THIS(MSZ2Cutscene);
15
16
if (!self->activated) {
17
MSZ2Cutscene_SetupCutscene();
18
19
self->activated = true;
20
}
21
}
22
23
void MSZ2Cutscene_LateUpdate(void) {}
24
25
void MSZ2Cutscene_StaticUpdate(void) {}
26
27
void MSZ2Cutscene_Draw(void) {}
28
29
void MSZ2Cutscene_Create(void *data)
30
{
31
RSDK_THIS(MSZ2Cutscene);
32
33
INIT_ENTITY(self);
34
CutsceneRules_SetupEntity(self, &self->size, &self->hitbox);
35
self->active = ACTIVE_NEVER;
36
}
37
38
void MSZ2Cutscene_StageLoad(void)
39
{
40
foreach_all(ParallaxSprite, sprite)
41
{
42
if (sprite->aniID == MSZ_PARALLAXSPRITE_OOZPEEK) {
43
MSZ2Cutscene->oozPeek = sprite;
44
foreach_break;
45
}
46
}
47
48
foreach_all(EggPrison, prison)
49
{
50
MSZ2Cutscene->prison = prison;
51
foreach_break;
52
}
53
}
54
55
void MSZ2Cutscene_SetupCutscene(void)
56
{
57
RSDK_THIS(MSZ2Cutscene);
58
59
CutsceneSeq_StartSequence(self, MSZ2Cutscene_Cutscene_GoToPistol, MSZ2Cutscene_Cutscene_EnterPistol, MSZ2Cutscene_Cutscene_PistolFired,
60
MSZ2Cutscene_Cutscene_AppearInBG, StateMachine_None);
61
62
#if MANIA_USE_PLUS
63
CutsceneSeq_SetSkipType(SKIPTYPE_RELOADSCN);
64
#endif
65
66
HUD_MoveOut();
67
}
68
69
void MSZ2Cutscene_GetPistolPtr(void)
70
{
71
RSDK_THIS(MSZ2Cutscene);
72
73
foreach_all(GiantPistol, pistol)
74
{
75
if (MathHelpers_PointInHitbox(self->position.x, self->position.y, pistol->position.x, pistol->position.y, self->direction, &self->hitbox)) {
76
MSZ2Cutscene->pistol = pistol;
77
foreach_break;
78
}
79
}
80
}
81
82
bool32 MSZ2Cutscene_Cutscene_GoToPistol(EntityCutsceneSeq *host)
83
{
84
MANIA_GET_PLAYER(player1, player2, camera);
85
UNUSED(camera);
86
87
EntityParallaxSprite *parallaxSprite = MSZ2Cutscene->oozPeek;
88
EntityEggPrison *prison = MSZ2Cutscene->prison;
89
90
if (!host->timer) {
91
MSZ2Cutscene_GetPistolPtr();
92
parallaxSprite->visible = true;
93
parallaxSprite->drawFX = FX_SCALE;
94
parallaxSprite->scale.x = 0x100;
95
parallaxSprite->scale.y = 0x100;
96
prison->notSolid = true;
97
98
Vector2 size;
99
RSDK.GetLayerSize(Zone->fgLayer[0], &size, true);
100
Zone->cameraBoundsT[0] = 0;
101
Zone->cameraBoundsT[1] = 0;
102
Zone->cameraBoundsR[0] = size.x;
103
Zone->cameraBoundsR[1] = size.x;
104
105
player1->stateInput = StateMachine_None;
106
CutsceneSeq_LockAllPlayerControl();
107
player1->state = Player_State_Ground;
108
player1->groundVel = 0;
109
110
if (player2->classID == Player->classID) {
111
#if GAME_VERSION != VER_100
112
Player->disableP2KeyCheck = true;
113
#endif
114
player2->state = Player_State_Ground;
115
player2->stateInput = Player_Input_P2_AI;
116
player2->groundVel = 0;
117
}
118
}
119
120
EntityGiantPistol *pistol = MSZ2Cutscene->pistol;
121
122
player1->right = player1->position.x < pistol->position.x - 0xD00000;
123
if (player1->position.x < pistol->position.x - 0xD00000) {
124
if (player2 && player2->jumpPress) {
125
player2->velocity.x = 0x44000;
126
player2->velocity.y = -0x80000;
127
}
128
}
129
else {
130
player1->position.x = pistol->position.x - 0xD00000;
131
Player_Action_Jump(player1);
132
player1->velocity.x = 0x44000;
133
player1->velocity.y = -0x80000;
134
player1->jumpPress = true;
135
player1->jumpHold = true;
136
return true;
137
}
138
139
return false;
140
}
141
142
bool32 MSZ2Cutscene_Cutscene_EnterPistol(EntityCutsceneSeq *host)
143
{
144
MANIA_GET_PLAYER(player1, player2, camera);
145
EntityGiantPistol *pistol = MSZ2Cutscene->pistol;
146
147
if (player2->classID == Player->classID) {
148
if (player2->state == Player_State_Air && player2->animator.animationID == ANI_JUMP)
149
player2->position.x += (player1->position.x - player2->position.x) >> 4;
150
player2->position.y += (player1->position.y - player2->position.y) >> 4;
151
}
152
153
if (!host->timer)
154
player1->jumpPress = false;
155
156
if (pistol->state == GiantPistol_State_CloseChamber) {
157
player1->jumpHold = false;
158
if (player2->classID == Player->classID) {
159
player2->position.x = player1->position.x;
160
player2->position.y = player1->position.y;
161
player2->stateInput = StateMachine_None;
162
player2->state = Player_State_Static;
163
player2->nextAirState = StateMachine_None;
164
player2->nextGroundState = StateMachine_None;
165
player2->velocity.x = 0;
166
player2->velocity.y = 0;
167
pistol->activePlayers |= 1 << player2->playerID;
168
}
169
}
170
171
if (pistol->rotation == 448) {
172
player1->jumpPress = true;
173
player1->camera = NULL;
174
camera->target = NULL;
175
return true;
176
}
177
178
return false;
179
}
180
181
bool32 MSZ2Cutscene_Cutscene_PistolFired(EntityCutsceneSeq *host)
182
{
183
MANIA_GET_PLAYER(player1, player2, camera);
184
185
Entity *curEntity = host->activeEntity;
186
if (!host->timer) {
187
player1->jumpPress = false;
188
player1->jumpHold = false;
189
}
190
191
if (player1->position.y < (curEntity->position.y - (ScreenInfo->center.y << 16) - 0x100000)) {
192
player1->state = Player_State_Static;
193
player1->velocity.x = 0;
194
player1->velocity.y = 0;
195
player1->position.y = 0;
196
}
197
198
if (player2->classID == Player->classID && player2->position.y < (curEntity->position.y - (ScreenInfo->center.y << 16) - 0x100000)) {
199
player2->state = Player_State_Static;
200
player2->velocity.x = 0;
201
player2->velocity.y = 0;
202
player2->position.y = 0;
203
}
204
205
if (host->timer == 30) {
206
host->storedValue = camera->position.x + 0x1000000;
207
host->storedTimer = camera->position.y - 0x4000000;
208
Camera_SetupLerp(CAMERA_LERP_NORMAL, 0, host->storedValue, host->storedTimer, 2);
209
}
210
211
if (host->timer > 30 && camera->position.x == host->storedValue && camera->position.y == host->storedTimer) {
212
EntityShield *shield = RSDK_GET_ENTITY(player1->playerID + Player->playerCount, Shield);
213
if (shield->classID == Shield->classID) {
214
player1->shield = SHIELD_NONE;
215
destroyEntity(shield);
216
}
217
return true;
218
}
219
220
return false;
221
}
222
223
bool32 MSZ2Cutscene_Cutscene_AppearInBG(EntityCutsceneSeq *host)
224
{
225
MANIA_GET_PLAYER(player1, player2, camera);
226
227
if (!host->timer) {
228
host->storedTimer = 0x4000;
229
RSDK.SetSpriteAnimation(player1->aniFrames, ANI_JUMP, &player1->animator, false, 0);
230
player1->drawFX |= FX_SCALE;
231
player1->animator.speed = 60;
232
player1->scale.x = 0x40;
233
player1->scale.y = 0x40;
234
player1->state = Player_State_Static;
235
player1->position.x = camera->position.x;
236
player1->position.y = camera->position.y - 0x700000;
237
238
if (player2->classID == Player->classID) {
239
player2->drawFX |= FX_SCALE;
240
player2->scale.x = 0x40;
241
player2->scale.y = 0x40;
242
player2->state = Player_State_Static;
243
player2->position.x = player1->position.x - 0x63000;
244
player2->position.y = player1->position.y - 0x24000;
245
player2->velocity.x = 0;
246
player2->velocity.y = 0;
247
RSDK.SetSpriteAnimation(player2->aniFrames, ANI_JUMP, &player2->animator, false, 0);
248
player1->animator.speed = 60;
249
}
250
}
251
252
if (host->timer > 0) {
253
player1->velocity.x = 0xB000;
254
player1->velocity.y = host->storedTimer;
255
256
if (player2->classID == Player->classID) {
257
player2->state = Player_State_Static;
258
player2->velocity.x = 0xB000;
259
player2->velocity.y = player1->velocity.y;
260
}
261
262
host->storedTimer += 144;
263
}
264
265
if (host->timer == 120)
266
Zone_StartFadeOut(10, 0x000000);
267
268
return false;
269
}
270
271
#if GAME_INCLUDE_EDITOR
272
void MSZ2Cutscene_EditorDraw(void)
273
{
274
RSDK_THIS(MSZ2Cutscene);
275
276
CutsceneRules_DrawCutsceneBounds(self, &self->size);
277
}
278
279
void MSZ2Cutscene_EditorLoad(void) {}
280
#endif
281
282
void MSZ2Cutscene_Serialize(void) { RSDK_EDITABLE_VAR(MSZ2Cutscene, VAR_VECTOR2, size); }
283
284