Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/FBZ/HangGlider.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: HangGlider 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
ObjectHangGlider *HangGlider;
12
13
void HangGlider_Update(void)
14
{
15
RSDK_THIS(HangGlider);
16
17
StateMachine_Run(self->state);
18
}
19
20
void HangGlider_LateUpdate(void) {}
21
22
void HangGlider_StaticUpdate(void) {}
23
24
void HangGlider_Draw(void)
25
{
26
RSDK_THIS(HangGlider);
27
28
if (SceneInfo->currentDrawGroup == self->drawGroup) {
29
RSDK.DrawSprite(&self->sailAnimator, NULL, false);
30
RSDK.DrawSprite(&self->handleBackAnimator, NULL, false);
31
32
if (self->attachedPlayer)
33
RSDK.DrawSprite(&self->playerAnimator, NULL, false);
34
35
RSDK.AddDrawListRef(Zone->objectDrawGroup[1], SceneInfo->entitySlot);
36
}
37
else {
38
RSDK.DrawSprite(&self->handleFrontAnimator, NULL, false);
39
}
40
}
41
42
void HangGlider_Create(void *data)
43
{
44
RSDK_THIS(HangGlider);
45
46
if (!SceneInfo->inEditor) {
47
self->visible = true;
48
self->drawGroup = Zone->objectDrawGroup[0];
49
self->active = ACTIVE_BOUNDS;
50
self->updateRange.x = 0x400000;
51
self->updateRange.y = 0x400000;
52
self->gravityStrength = 0x1000;
53
self->state = HangGlider_State_CheckGrab;
54
55
RSDK.SetSpriteAnimation(HangGlider->aniFrames, 0, &self->sailAnimator, true, 0);
56
RSDK.SetSpriteAnimation(HangGlider->aniFrames, 1, &self->handleBackAnimator, true, 0);
57
RSDK.SetSpriteAnimation(HangGlider->aniFrames, 1, &self->handleFrontAnimator, true, 1);
58
}
59
}
60
61
void HangGlider_StageLoad(void)
62
{
63
if (RSDK.CheckSceneFolder("FBZ"))
64
HangGlider->aniFrames = RSDK.LoadSpriteAnimation("FBZ/HangGlider.bin", SCOPE_STAGE);
65
else
66
HangGlider->aniFrames = RSDK.LoadSpriteAnimation("PSZ1/HangGlider.bin", SCOPE_STAGE);
67
68
// A distance check was used instead
69
HangGlider->hitboxUnused.left = 12;
70
HangGlider->hitboxUnused.top = 8;
71
HangGlider->hitboxUnused.right = 24;
72
HangGlider->hitboxUnused.bottom = 128;
73
}
74
75
void HangGlider_State_CheckGrab(void)
76
{
77
RSDK_THIS(HangGlider);
78
79
foreach_active(Player, player)
80
{
81
if (abs(player->position.x - self->position.x) < 0x40000 && abs(player->position.y - self->position.y) < 0x140000) {
82
self->attachedPlayer = player;
83
player->active = ACTIVE_NEVER;
84
player->visible = false;
85
self->velocity.x = (0xC0 * player->velocity.x) >> 8;
86
87
RSDK.SetSpriteAnimation(player->aniFrames, ANI_SPRING_DIAGONAL, &self->playerAnimator, true, 0);
88
self->playerAnimator.rotationStyle = ROTSTYLE_FULL;
89
self->rotation = 0x80;
90
self->drawFX = FX_ROTATE;
91
RSDK.PlaySfx(Player->sfxGrab, false, 255);
92
self->state = HangGlider_State_Glide;
93
}
94
}
95
}
96
void HangGlider_State_Glide(void)
97
{
98
RSDK_THIS(HangGlider);
99
100
self->velocity.y += self->gravityStrength;
101
if (self->velocity.y > 0x10000)
102
self->velocity.y = 0x10000;
103
104
self->position.x += self->velocity.x;
105
self->position.y += self->velocity.y;
106
107
EntityPlayer *player = self->attachedPlayer;
108
if (player) {
109
player->position.x = self->position.x;
110
player->position.y = self->position.y;
111
}
112
113
RSDK.ProcessAnimation(&self->sailAnimator);
114
RSDK.ProcessAnimation(&self->playerAnimator);
115
}
116
117
#if GAME_INCLUDE_EDITOR
118
void HangGlider_EditorDraw(void)
119
{
120
RSDK_THIS(HangGlider);
121
122
RSDK.SetSpriteAnimation(HangGlider->aniFrames, 0, &self->sailAnimator, true, 0);
123
RSDK.SetSpriteAnimation(HangGlider->aniFrames, 1, &self->handleBackAnimator, true, 0);
124
RSDK.SetSpriteAnimation(HangGlider->aniFrames, 1, &self->handleFrontAnimator, true, 1);
125
126
RSDK.DrawSprite(&self->sailAnimator, NULL, false);
127
RSDK.DrawSprite(&self->handleBackAnimator, NULL, false);
128
RSDK.DrawSprite(&self->handleFrontAnimator, NULL, false);
129
}
130
131
void HangGlider_EditorLoad(void)
132
{
133
if (RSDK.CheckSceneFolder("FBZ"))
134
HangGlider->aniFrames = RSDK.LoadSpriteAnimation("FBZ/HangGlider.bin", SCOPE_STAGE);
135
else
136
HangGlider->aniFrames = RSDK.LoadSpriteAnimation("PSZ1/HangGlider.bin", SCOPE_STAGE);
137
}
138
#endif
139
140
void HangGlider_Serialize(void) {}
141
#endif
142
143