Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/PGZ/PSZ1Intro.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: PSZ1Intro 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
ObjectPSZ1Intro *PSZ1Intro;
12
13
void PSZ1Intro_Update(void)
14
{
15
RSDK_THIS(PSZ1Intro);
16
17
CutsceneSeq_StartSequence(self, PSZ1Intro_Cutscene_SetupGliders, PSZ1Intro_Cutscene_GlideAndJump, PSZ1Intro_Cutscene_HandleLanding,
18
StateMachine_None);
19
20
#if MANIA_USE_PLUS
21
CutsceneSeq_SetSkipType(SKIPTYPE_DISABLED);
22
#endif
23
24
self->active = ACTIVE_NEVER;
25
}
26
27
void PSZ1Intro_LateUpdate(void) {}
28
29
void PSZ1Intro_StaticUpdate(void) {}
30
31
void PSZ1Intro_Draw(void) {}
32
33
void PSZ1Intro_Create(void *data)
34
{
35
RSDK_THIS(PSZ1Intro);
36
37
if (!SceneInfo->inEditor) {
38
self->active = ACTIVE_NORMAL;
39
self->isPermanent = true;
40
41
if (!isMainGameMode() || !globals->enableIntro || CutsceneRules_CheckStageReload()) {
42
destroyEntity(self);
43
44
foreach_all(HangGlider, glider) { destroyEntity(glider); }
45
}
46
}
47
}
48
49
void PSZ1Intro_StageLoad(void) {}
50
51
void PSZ1Intro_HandleGliderJump(EntityHangGlider *glider)
52
{
53
EntityPlayer *player = glider->attachedPlayer;
54
55
if (player) {
56
player->state = Player_State_Air;
57
player->onGround = false;
58
player->velocity.x = glider->velocity.x >> 2;
59
player->velocity.y = -0x20000;
60
player->active = ACTIVE_NORMAL;
61
player->stateInput = StateMachine_None;
62
RSDK.SetSpriteAnimation(player->aniFrames, ANI_JUMP, &player->animator, true, 0);
63
glider->attachedPlayer = NULL;
64
}
65
}
66
67
bool32 PSZ1Intro_Cutscene_SetupGliders(EntityCutsceneSeq *host)
68
{
69
RSDK_THIS(PSZ1Intro);
70
71
CutsceneSeq_LockAllPlayerControl();
72
73
int32 id = 0;
74
foreach_all(HangGlider, glider)
75
{
76
if (id < Player->playerCount) {
77
EntityPlayer *player = RSDK_GET_ENTITY(id, Player);
78
player->position.x = glider->position.x;
79
player->position.y = glider->position.y;
80
player->active = ACTIVE_NEVER;
81
glider->active = ACTIVE_NORMAL;
82
glider->attachedPlayer = player;
83
glider->velocity.x = 0x40000;
84
glider->velocity.y = -0x20000;
85
86
RSDK.SetSpriteAnimation(player->aniFrames, ANI_SPRING_DIAGONAL, &glider->playerAnimator, true, 0);
87
glider->playerAnimator.rotationStyle = ROTSTYLE_FULL;
88
glider->rotation = 0x80;
89
glider->drawFX = FX_ROTATE;
90
glider->state = HangGlider_State_Glide;
91
92
EntityCamera *camera = player->camera;
93
if (camera) {
94
camera->position.x = glider->position.x;
95
camera->position.y = glider->position.y;
96
camera->disableYOffset = true;
97
camera->offset.y = 0x200000;
98
}
99
else {
100
glider->velocity.x = 0x38000;
101
glider->gravityStrength = 0xE00;
102
}
103
104
self->gliders[id] = glider;
105
}
106
else {
107
destroyEntity(glider);
108
}
109
110
++id;
111
}
112
113
BGSwitch->screenID = 0;
114
115
RSDK.GetTileLayer(0)->drawGroup[BGSwitch->screenID] = 0; // Background 1
116
RSDK.GetTileLayer(1)->drawGroup[BGSwitch->screenID] = DRAWGROUP_COUNT; // Background 2
117
RSDK.GetTileLayer(2)->drawGroup[BGSwitch->screenID] = DRAWGROUP_COUNT; // Background 3
118
119
return true;
120
}
121
122
bool32 PSZ1Intro_Cutscene_GlideAndJump(EntityCutsceneSeq *host)
123
{
124
RSDK_THIS(PSZ1Intro);
125
126
if (++self->timer == 90) {
127
if (self->gliders[0])
128
PSZ1Intro_HandleGliderJump(self->gliders[0]);
129
}
130
131
if (self->timer == 120) {
132
self->timer = 0;
133
134
if (self->gliders[1])
135
PSZ1Intro_HandleGliderJump(self->gliders[1]);
136
137
return true;
138
}
139
140
return false;
141
}
142
143
bool32 PSZ1Intro_Cutscene_HandleLanding(EntityCutsceneSeq *host)
144
{
145
foreach_active(HangGlider, glider)
146
{
147
if (!glider->onScreen)
148
destroyEntity(glider);
149
}
150
151
foreach_active(Player, player)
152
{
153
if (player->onGround) {
154
if (player->sidekick) {
155
if (player->stateInput == StateMachine_None) {
156
player->stateInput = Player_Input_P2_AI;
157
158
for (int32 i = 0; i < 16; ++i) Player->leaderPositionBuffer[i] = player->position;
159
}
160
}
161
else {
162
player->stateInput = Player_Input_P1;
163
}
164
165
player->collisionPlane = 0;
166
player->groundVel = 0;
167
player->direction = FLIP_NONE;
168
}
169
else if (player->stateInput == StateMachine_None) {
170
return false;
171
}
172
}
173
174
return true;
175
}
176
177
#if GAME_INCLUDE_EDITOR
178
void PSZ1Intro_EditorDraw(void) {}
179
180
void PSZ1Intro_EditorLoad(void) {}
181
#endif
182
183
void PSZ1Intro_Serialize(void) {}
184
#endif
185
186