Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/MSZ/RotatingSpikes.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: RotatingSpikes Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectRotatingSpikes *RotatingSpikes;
11
12
void RotatingSpikes_Update(void)
13
{
14
RSDK_THIS(RotatingSpikes);
15
16
RSDK.ProcessAnimation(&self->pivotAnimator);
17
RSDK.ProcessAnimation(&self->spikeBallAnimator);
18
19
self->angle = (self->angle + self->rotSpeed) & 0x3FF;
20
21
Hitbox *hitbox = RSDK.GetHitbox(&self->spikeBallAnimator, 0);
22
int32 storeX = self->position.x;
23
int32 storeY = self->position.y;
24
25
foreach_active(Player, player)
26
{
27
int32 radius = self->spikeRadius + self->pivotRadius;
28
for (int32 i = 0; i < self->spikeCount; ++i) {
29
self->position.x = storeX + ((radius * RSDK.Cos1024(self->angle + self->angleOffset)) << 6);
30
self->position.y = storeY + ((radius * RSDK.Sin1024(self->angle + self->angleOffset)) << 6);
31
if (Player_CheckCollisionTouch(player, self, hitbox)) {
32
#if MANIA_USE_PLUS
33
if (!Player_CheckMightyUnspin(player, 0x400, 2, &player->uncurlTimer))
34
#endif
35
Player_Hurt(player, self);
36
}
37
radius += 2 * self->spikeRadius;
38
}
39
}
40
41
self->position.x = storeX;
42
self->position.y = storeY;
43
}
44
45
void RotatingSpikes_LateUpdate(void) {}
46
47
void RotatingSpikes_StaticUpdate(void) {}
48
49
void RotatingSpikes_Draw(void)
50
{
51
RSDK_THIS(RotatingSpikes);
52
53
int32 radius = self->spikeRadius + self->pivotRadius;
54
RSDK.DrawSprite(&self->pivotAnimator, NULL, false);
55
56
for (int32 i = 0; i < self->spikeCount; ++i) {
57
Vector2 drawPos;
58
drawPos.x = ((radius * RSDK.Cos1024(self->angleOffset + self->angle)) << 6) + self->position.x;
59
drawPos.y = ((radius * RSDK.Sin1024(self->angleOffset + self->angle)) << 6) + self->position.y;
60
RSDK.DrawSprite(&self->spikeBallAnimator, &drawPos, false);
61
62
radius += self->spikeRadius << 1;
63
}
64
}
65
66
void RotatingSpikes_Create(void *data)
67
{
68
RSDK_THIS(RotatingSpikes);
69
70
if (!SceneInfo->inEditor) {
71
self->active = ACTIVE_BOUNDS;
72
self->visible = true;
73
self->updateRange.x = 0x800000;
74
self->updateRange.y = 0x800000;
75
self->angleOffset &= 0x3FF;
76
self->drawGroup = self->priority == ROTSPIKES_PRIO_LOW ? Zone->objectDrawGroup[0] : Zone->objectDrawGroup[1];
77
78
RSDK.SetSpriteAnimation(RotatingSpikes->aniFrames, 0, &self->pivotAnimator, true, 0);
79
RSDK.SetSpriteAnimation(RotatingSpikes->aniFrames, 1, &self->spikeBallAnimator, true, 0);
80
}
81
}
82
83
void RotatingSpikes_StageLoad(void)
84
{
85
if (RSDK.CheckSceneFolder("MSZ"))
86
RotatingSpikes->aniFrames = RSDK.LoadSpriteAnimation("MSZ/RotatingSpikes.bin", SCOPE_STAGE);
87
else if (RSDK.CheckSceneFolder("SSZ1"))
88
RotatingSpikes->aniFrames = RSDK.LoadSpriteAnimation("SSZ1/RotatingSpikes.bin", SCOPE_STAGE);
89
}
90
91
#if GAME_INCLUDE_EDITOR
92
void RotatingSpikes_EditorDraw(void)
93
{
94
RSDK_THIS(RotatingSpikes);
95
96
RSDK.SetSpriteAnimation(RotatingSpikes->aniFrames, 0, &self->pivotAnimator, true, 0);
97
RSDK.SetSpriteAnimation(RotatingSpikes->aniFrames, 1, &self->spikeBallAnimator, true, 0);
98
99
self->drawGroup = self->priority == ROTSPIKES_PRIO_LOW ? Zone->objectDrawGroup[0] : Zone->objectDrawGroup[1];
100
101
RSDK.SetSpriteAnimation(RotatingSpikes->aniFrames, 0, &self->pivotAnimator, true, 0);
102
RSDK.SetSpriteAnimation(RotatingSpikes->aniFrames, 1, &self->spikeBallAnimator, true, 0);
103
104
int32 radius = self->spikeRadius + self->pivotRadius;
105
RSDK.DrawSprite(&self->pivotAnimator, NULL, false);
106
107
for (int32 i = 0; i < self->spikeCount; ++i) {
108
Vector2 drawPos;
109
drawPos.x = ((radius * RSDK.Cos1024((self->angleOffset & 0x3FF) + self->angle)) << 6) + self->position.x;
110
drawPos.y = ((radius * RSDK.Sin1024((self->angleOffset & 0x3FF) + self->angle)) << 6) + self->position.y;
111
RSDK.DrawSprite(&self->spikeBallAnimator, &drawPos, false);
112
113
radius += self->spikeRadius << 1;
114
}
115
}
116
117
void RotatingSpikes_EditorLoad(void)
118
{
119
if (RSDK.CheckSceneFolder("MSZ"))
120
RotatingSpikes->aniFrames = RSDK.LoadSpriteAnimation("MSZ/RotatingSpikes.bin", SCOPE_STAGE);
121
else if (RSDK.CheckSceneFolder("SSZ1"))
122
RotatingSpikes->aniFrames = RSDK.LoadSpriteAnimation("SSZ1/RotatingSpikes.bin", SCOPE_STAGE);
123
124
RSDK_ACTIVE_VAR(RotatingSpikes, priority);
125
RSDK_ENUM_VAR("Low", ROTSPIKES_PRIO_LOW);
126
RSDK_ENUM_VAR("High", ROTSPIKES_PRIO_HIGH);
127
}
128
#endif
129
130
void RotatingSpikes_Serialize(void)
131
{
132
RSDK_EDITABLE_VAR(RotatingSpikes, VAR_ENUM, pivotRadius);
133
RSDK_EDITABLE_VAR(RotatingSpikes, VAR_ENUM, spikeRadius);
134
RSDK_EDITABLE_VAR(RotatingSpikes, VAR_ENUM, spikeCount);
135
RSDK_EDITABLE_VAR(RotatingSpikes, VAR_ENUM, rotSpeed);
136
RSDK_EDITABLE_VAR(RotatingSpikes, VAR_ENUM, angleOffset);
137
RSDK_EDITABLE_VAR(RotatingSpikes, VAR_ENUM, priority);
138
}
139
140