Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/FBZ/MagSpikeBall.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: MagSpikeBall Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectMagSpikeBall *MagSpikeBall;
11
12
void MagSpikeBall_Update(void)
13
{
14
RSDK_THIS(MagSpikeBall);
15
16
self->position.y += self->velocity.y;
17
if (self->direction) {
18
self->velocity.y -= 0x3800;
19
if (RSDK.ObjectTileCollision(self, Zone->collisionLayers, CMODE_ROOF, 0, 0, -0xC0000, true))
20
self->velocity.y = 0;
21
22
self->direction = FLIP_NONE;
23
}
24
else {
25
self->velocity.y += 0x3800;
26
if (self->velocity.y <= 0 && RSDK.ObjectTileCollision(self, Zone->collisionLayers, CMODE_ROOF, 0, 0, -0xC0000, true))
27
self->velocity.y = 0;
28
29
bool32 collided = RSDK.ObjectTileCollision(self, Zone->collisionLayers, CMODE_FLOOR, 0, 0, 0xC0000, true);
30
31
foreach_all(MagPlatform, platform)
32
{
33
platform->position.x = platform->drawPos.x - platform->collisionOffset.x;
34
platform->position.y = platform->drawPos.y - platform->collisionOffset.y;
35
Hitbox *hitbox = RSDK.GetHitbox(&platform->animator, 0);
36
collided |= RSDK.CheckObjectCollisionPlatform(platform, hitbox, self, &MagSpikeBall->hitboxSpikeBall, true);
37
38
platform->position.x = platform->centerPos.x;
39
platform->position.y = platform->centerPos.y;
40
}
41
42
if (collided) {
43
self->velocity.y = 0;
44
self->active = ACTIVE_BOUNDS;
45
}
46
}
47
48
foreach_active(Player, player)
49
{
50
if (Player_CheckCollisionTouch(player, self, &MagSpikeBall->hitboxSpikeBall)) {
51
#if MANIA_USE_PLUS
52
if (player->onGround && (self->velocity.y > 0 || !Player_CheckMightyUnspin(player, 0x400, true, &player->uncurlTimer)))
53
#endif
54
Player_Hurt(player, self);
55
}
56
}
57
}
58
59
void MagSpikeBall_LateUpdate(void) {}
60
61
void MagSpikeBall_StaticUpdate(void) {}
62
63
void MagSpikeBall_Draw(void)
64
{
65
RSDK_THIS(MagSpikeBall);
66
67
RSDK.DrawSprite(&self->animator, NULL, false);
68
}
69
70
void MagSpikeBall_Create(void *data)
71
{
72
RSDK_THIS(MagSpikeBall);
73
74
self->active = ACTIVE_BOUNDS;
75
self->visible = true;
76
self->updateRange.x = 0x400000;
77
self->updateRange.y = 0x400000;
78
self->drawGroup = Zone->objectDrawGroup[0];
79
80
RSDK.SetSpriteAnimation(MagSpikeBall->aniFrames, 0, &self->animator, true, 0);
81
}
82
83
void MagSpikeBall_StageLoad(void)
84
{
85
if (RSDK.CheckSceneFolder("FBZ"))
86
MagSpikeBall->aniFrames = RSDK.LoadSpriteAnimation("FBZ/MagSpikeBall.bin", SCOPE_STAGE);
87
88
MagSpikeBall->hitboxSpikeBall.left = -12;
89
MagSpikeBall->hitboxSpikeBall.top = -12;
90
MagSpikeBall->hitboxSpikeBall.right = 12;
91
MagSpikeBall->hitboxSpikeBall.bottom = 12;
92
}
93
94
#if GAME_INCLUDE_EDITOR
95
void MagSpikeBall_EditorDraw(void) { MagSpikeBall_Draw(); }
96
97
void MagSpikeBall_EditorLoad(void) { MagSpikeBall->aniFrames = RSDK.LoadSpriteAnimation("FBZ/MagSpikeBall.bin", SCOPE_STAGE); }
98
#endif
99
100
void MagSpikeBall_Serialize(void) {}
101
102