Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/MSZ/MSZCutsceneK.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: MSZCutsceneK Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectMSZCutsceneK *MSZCutsceneK;
11
12
void MSZCutsceneK_Update(void)
13
{
14
RSDK_THIS(MSZCutsceneK);
15
16
if (!self->activated) {
17
MSZCutsceneK_StartCutscene();
18
self->activated = true;
19
}
20
}
21
22
void MSZCutsceneK_LateUpdate(void) {}
23
24
void MSZCutsceneK_StaticUpdate(void) {}
25
26
void MSZCutsceneK_Draw(void) {}
27
28
void MSZCutsceneK_Create(void *data)
29
{
30
RSDK_THIS(MSZCutsceneK);
31
32
INIT_ENTITY(self);
33
CutsceneRules_SetupEntity(self, &self->size, &self->hitbox);
34
self->active = ACTIVE_BOUNDS;
35
}
36
37
void MSZCutsceneK_StageLoad(void)
38
{
39
MSZCutsceneK->playerFrames = RSDK.LoadSpriteAnimation("Players/KnuxCutsceneAIZ.bin", SCOPE_STAGE);
40
41
MSZCutsceneK->sfxImpact = RSDK.GetSfx("Stage/Impact5.wav");
42
MSZCutsceneK->sfxDrop = RSDK.GetSfx("Stage/Drop.wav");
43
44
MSZCutsceneK->mystic = NULL;
45
MSZCutsceneK->tornado = NULL;
46
47
foreach_all(HeavyMystic, mystic)
48
{
49
MSZCutsceneK->mystic = mystic;
50
foreach_break;
51
}
52
53
foreach_all(Tornado, tornado)
54
{
55
MSZCutsceneK->tornado = tornado;
56
foreach_break;
57
}
58
}
59
60
#if MANIA_USE_PLUS
61
void MSZCutsceneK_Cutscene_SkipCB(void)
62
{
63
RSDK.SetScene("Mania Mode", "");
64
SceneInfo->listPos += TimeAttackData_GetManiaListPos(ZONE_MSZ, ACT_1, CHAR_KNUX);
65
}
66
#endif
67
68
void MSZCutsceneK_StartCutscene(void)
69
{
70
RSDK_THIS(MSZCutsceneK);
71
72
CutsceneSeq_StartSequence(self, MSZCutsceneK_Cutscene_RidingTornado, MSZCutsceneK_Cutscene_KnockedOffTornado, StateMachine_None);
73
74
#if MANIA_USE_PLUS
75
CutsceneSeq_SetSkipTypeCallback(MSZCutsceneK_Cutscene_SkipCB);
76
#endif
77
}
78
79
void MSZCutsceneK_SetupP2(int32 x, int32 y)
80
{
81
Player->sonicFrames = RSDK.LoadSpriteAnimation("Players/Sonic.bin", SCOPE_STAGE);
82
Player->superFrames = RSDK.LoadSpriteAnimation("Players/SuperSonic.bin", SCOPE_STAGE);
83
84
RSDK.ResetEntitySlot(SLOT_PLAYER2, Player->classID, NULL);
85
86
EntityPlayer *player2 = RSDK_GET_ENTITY(SLOT_PLAYER2, Player);
87
++Player->playerCount;
88
player2->characterID = ID_SONIC;
89
player2->position.x = x;
90
player2->position.y = y;
91
player2->aniFrames = Player->sonicFrames;
92
player2->tailFrames = -1;
93
player2->jumpOffset = 0x50000;
94
player2->stateAbility = Player_JumpAbility_Sonic;
95
player2->sensorY = 0x140000;
96
player2->stateInput = StateMachine_None;
97
player2->state = Player_State_Static;
98
RSDK.SetSpriteAnimation(Player->sonicFrames, ANI_RIDE, &player2->animator, true, 0);
99
}
100
101
bool32 MSZCutsceneK_Cutscene_RidingTornado(EntityCutsceneSeq *host)
102
{
103
MANIA_GET_PLAYER(player1, player2, camera);
104
UNUSED(player2);
105
UNUSED(camera);
106
107
EntityHeavyMystic *mystic = MSZCutsceneK->mystic;
108
EntityTornado *tornado = MSZCutsceneK->tornado;
109
if (!host->timer) {
110
SceneInfo->timeEnabled = false;
111
SceneInfo->milliseconds = 0;
112
player1->state = Player_State_Static;
113
player1->stateInput = StateMachine_None;
114
CutsceneSeq_LockAllPlayerControl();
115
player1->velocity.x = 0;
116
player1->velocity.y = 0;
117
RSDK.SetSpriteAnimation(MSZCutsceneK->playerFrames, 6, &player1->animator, true, 0);
118
MSZCutsceneK_SetupP2(0xCC0000, 0x29E0000);
119
}
120
121
if (mystic->position.x > tornado->position.x - 0x100000) {
122
MSZCutsceneK->tornadoDistanceP1.x = player1->position.x - tornado->position.x;
123
MSZCutsceneK->tornadoDistanceP1.y = player1->position.y - tornado->position.y;
124
MSZCutsceneK->tornadoDistanceP2.x = player2->position.x - tornado->position.x;
125
MSZCutsceneK->tornadoDistanceP2.y = player2->position.y - tornado->position.y;
126
return true;
127
}
128
129
return false;
130
}
131
132
bool32 MSZCutsceneK_Cutscene_KnockedOffTornado(EntityCutsceneSeq *host)
133
{
134
MANIA_GET_PLAYER(player1, player2, camera);
135
UNUSED(player2);
136
UNUSED(camera);
137
138
EntityTornado *tornado = MSZCutsceneK->tornado;
139
140
if (!host->timer) {
141
Music_Stop();
142
RSDK.PlaySfx(MSZCutsceneK->sfxImpact, false, 0xFF);
143
tornado->velocity.y = -0x10000;
144
if (!host->values[0]) {
145
host->values[0] = true;
146
RSDK.PlaySfx(MSZCutsceneK->sfxDrop, false, 0xFF);
147
RSDK.SetSpriteAnimation(MSZCutsceneK->playerFrames, 4, &player1->animator, true, 0);
148
player1->velocity.x = -0x10000;
149
player1->velocity.y = -0x30000;
150
}
151
}
152
153
tornado->position.x += tornado->velocity.x;
154
tornado->position.y += tornado->velocity.y;
155
156
if (tornado->position.y >= tornado->movePos.y) {
157
tornado->velocity.y = 0;
158
tornado->position.y = tornado->movePos.y;
159
}
160
else {
161
tornado->velocity.y += 0x3800;
162
}
163
164
if (host->values[0]) {
165
if (!host->values[2])
166
player1->velocity.y += 0x3800;
167
}
168
else {
169
player1->position.x = tornado->position.x + MSZCutsceneK->tornadoDistanceP1.x;
170
player1->position.y = tornado->position.y + MSZCutsceneK->tornadoDistanceP1.y;
171
}
172
173
if (host->values[1]) {
174
if (host->timer - host->storedTimer == 15) {
175
globals->suppressTitlecard = true;
176
globals->suppressAutoMusic = true;
177
globals->enableIntro = true;
178
RSDK.SetScene("Mania Mode", "");
179
SceneInfo->listPos += TimeAttackData_GetManiaListPos(ZONE_MSZ, ACT_1, CHAR_KNUX);
180
Zone_StartFadeOut(10, 0x000000);
181
}
182
else if (host->timer - host->storedTimer == 60) {
183
player1->velocity.y = 0;
184
host->values[2] = true;
185
}
186
}
187
else if (player1->position.y > tornado->position.y) {
188
TornadoPath->camera = NULL;
189
host->values[1] = true;
190
host->storedTimer = host->timer;
191
MSZCutsceneK->pos3 = camera->position;
192
MSZCutsceneK->pos3.y += 0x1E00000;
193
Camera_SetupLerp(CAMERA_LERP_NORMAL, 0, MSZCutsceneK->pos3.x, MSZCutsceneK->pos3.y, 3);
194
}
195
196
player2->position.x = tornado->position.x + MSZCutsceneK->tornadoDistanceP2.x;
197
player2->position.y = tornado->position.y + MSZCutsceneK->tornadoDistanceP2.y;
198
return false;
199
}
200
201
#if GAME_INCLUDE_EDITOR
202
void MSZCutsceneK_EditorDraw(void)
203
{
204
RSDK_THIS(MSZCutsceneK);
205
206
CutsceneRules_DrawCutsceneBounds(self, &self->size);
207
}
208
209
void MSZCutsceneK_EditorLoad(void) {}
210
#endif
211
212
void MSZCutsceneK_Serialize(void) { RSDK_EDITABLE_VAR(MSZCutsceneK, VAR_VECTOR2, size); }
213
214