Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/Common/Projectile.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: Projectile Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectProjectile *Projectile;
11
12
void Projectile_Update(void)
13
{
14
RSDK_THIS(Projectile);
15
16
StateMachine_Run(self->state);
17
18
if (self->drawFX & FX_ROTATE)
19
self->rotation = (self->rotation + self->rotationSpeed) & 0x1FF;
20
21
RSDK.ProcessAnimation(&self->animator);
22
}
23
24
void Projectile_LateUpdate(void) {}
25
26
void Projectile_StaticUpdate(void) {}
27
28
void Projectile_Draw(void)
29
{
30
RSDK_THIS(Projectile);
31
32
RSDK.DrawSprite(&self->animator, NULL, false);
33
}
34
35
void Projectile_Create(void *data)
36
{
37
RSDK_THIS(Projectile);
38
39
self->active = ACTIVE_NORMAL;
40
self->visible = true;
41
self->state = (Type_StateMachine)data;
42
}
43
44
void Projectile_StageLoad(void) {}
45
46
void Projectile_CheckPlayerCollisions(void)
47
{
48
RSDK_THIS(Projectile);
49
50
foreach_active(Player, player)
51
{
52
if (Player_CheckCollisionTouch(player, self, &self->hitbox)) {
53
switch (self->type) {
54
case PROJECTILE_NOTHING: break;
55
56
case PROJECTILE_FIRE:
57
if (self->isProjectile)
58
Player_ProjectileHurt(player, self);
59
else
60
Player_ElementHurt(player, self, SHIELD_FIRE);
61
break;
62
63
case PROJECTILE_ELECTRIC:
64
if (self->isProjectile)
65
Player_ProjectileHurt(player, self);
66
else
67
Player_ElementHurt(player, self, SHIELD_LIGHTNING);
68
break;
69
70
case PROJECTILE_UNUSED1: break;
71
72
case PROJECTILE_UNUSED2: break;
73
74
case PROJECTILE_UNUSED3: break;
75
76
case PROJECTILE_BASIC:
77
case PROJECTILE_BASIC2: {
78
#if MANIA_USE_PLUS
79
int32 anim = player->animator.animationID;
80
#endif
81
82
if (self->isProjectile
83
#if MANIA_USE_PLUS
84
|| (player->characterID == ID_MIGHTY
85
&& (anim == ANI_CROUCH || anim == ANI_JUMP || anim == ANI_SPINDASH || anim == ANI_HAMMERDROP))
86
#endif
87
) {
88
if (Player_ProjectileHurt(player, self)) {
89
self->gravityStrength = 0x3800;
90
self->state = Projectile_State_MoveGravity;
91
}
92
}
93
else {
94
Player_Hurt(player, self);
95
}
96
break;
97
}
98
99
default: break;
100
}
101
}
102
}
103
}
104
105
void Projectile_State_Move(void)
106
{
107
RSDK_THIS(Projectile);
108
109
self->position.x += self->velocity.x;
110
self->position.y += self->velocity.y;
111
112
if (self->hurtDelay <= 0)
113
Projectile_CheckPlayerCollisions();
114
else
115
self->hurtDelay--;
116
117
if (self->timer <= 0) {
118
if (!RSDK.CheckOnScreen(self, NULL))
119
destroyEntity(self);
120
}
121
else {
122
if (!self->timer)
123
destroyEntity(self);
124
}
125
}
126
127
void Projectile_State_MoveGravity(void)
128
{
129
RSDK_THIS(Projectile);
130
131
self->position.x += self->velocity.x;
132
self->position.y += self->velocity.y;
133
self->velocity.y += self->gravityStrength;
134
135
if (self->hurtDelay <= 0)
136
Projectile_CheckPlayerCollisions();
137
else
138
self->hurtDelay--;
139
140
if (self->timer <= 0) {
141
if (!RSDK.CheckOnScreen(self, NULL))
142
destroyEntity(self);
143
}
144
else {
145
if (!self->timer)
146
destroyEntity(self);
147
}
148
}
149
150
#if GAME_INCLUDE_EDITOR
151
void Projectile_EditorDraw(void) {}
152
153
void Projectile_EditorLoad(void) {}
154
#endif
155
156
void Projectile_Serialize(void) {}
157
158