Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/HCZ/Spear.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: Spear Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectSpear *Spear;
11
12
void Spear_Update(void)
13
{
14
RSDK_THIS(Spear);
15
16
int32 timer = (self->intervalOffset + Zone->timer) % self->interval;
17
18
if (timer >= self->duration) {
19
if (timer - self->duration >= 6)
20
self->retractPos = 0;
21
else
22
self->retractPos = 0x48000 * (6 - (timer - self->duration));
23
}
24
else {
25
if (timer >= 6)
26
self->retractPos = 0x1B0000;
27
else
28
self->retractPos = 0x48000 * timer;
29
30
if (self->retractPos == 0x48000)
31
RSDK.PlaySfx(Spear->sfxSpear, false, 0xFF);
32
}
33
34
Spear_SetupHitboxes();
35
36
foreach_active(Player, player)
37
{
38
if (Player_CheckCollisionTouch(player, self, &self->hitbox)) {
39
#if MANIA_USE_PLUS
40
if (!Player_CheckMightyUnspin(player, 0x200, 2, &player->uncurlTimer))
41
#endif
42
Player_Hurt(player, self);
43
}
44
}
45
}
46
47
void Spear_LateUpdate(void) {}
48
49
void Spear_StaticUpdate(void) {}
50
51
void Spear_Draw(void)
52
{
53
RSDK_THIS(Spear);
54
55
Vector2 drawPos = self->position;
56
switch (self->orientation) {
57
case SPEAR_UP:
58
drawPos.y = self->position.y + 0x1B0000;
59
drawPos.y = self->position.y + 0x1B0000 - self->retractPos;
60
break;
61
62
case SPEAR_RIGHT:
63
drawPos.x = self->position.x - 0x1B0000;
64
drawPos.x = self->position.x - 0x1B0000 + self->retractPos;
65
break;
66
67
case SPEAR_DOWN:
68
drawPos.y = self->position.y - 0x1B0000;
69
drawPos.y = self->position.y - 0x1B0000 + self->retractPos;
70
break;
71
72
case SPEAR_LEFT:
73
drawPos.x = self->position.x + 0x1B0000;
74
drawPos.x = self->position.x + 0x1B0000 - self->retractPos;
75
break;
76
77
default: break;
78
}
79
80
RSDK.DrawSprite(&self->spearAnimator, &drawPos, false);
81
RSDK.DrawSprite(&self->baseAnimator, NULL, false);
82
}
83
84
void Spear_Create(void *data)
85
{
86
RSDK_THIS(Spear);
87
88
if (SceneInfo->inEditor) {
89
if (!self->interval)
90
self->interval = 120;
91
92
if (!self->duration)
93
self->duration = 60;
94
}
95
96
self->active = ACTIVE_BOUNDS;
97
self->drawGroup = Zone->objectDrawGroup[0];
98
self->startPos = self->position;
99
self->visible = true;
100
self->drawFX = FX_FLIP;
101
self->updateRange.x = 0x800000;
102
self->updateRange.y = 0x800000;
103
104
int32 anim = 0;
105
switch (self->orientation) {
106
case SPEAR_UP:
107
self->direction = FLIP_NONE;
108
anim = 0;
109
break;
110
111
case SPEAR_RIGHT:
112
self->direction = FLIP_NONE;
113
anim = 1;
114
break;
115
116
case SPEAR_DOWN:
117
self->direction = FLIP_Y;
118
anim = 0;
119
break;
120
121
case SPEAR_LEFT:
122
self->direction = FLIP_X;
123
anim = 1;
124
break;
125
126
default: break;
127
}
128
129
RSDK.SetSpriteAnimation(Spear->aniFrames, anim, &self->baseAnimator, true, 0);
130
RSDK.SetSpriteAnimation(Spear->aniFrames, anim, &self->spearAnimator, true, 1);
131
}
132
133
void Spear_StageLoad(void)
134
{
135
Spear->aniFrames = RSDK.LoadSpriteAnimation("HCZ/Spear.bin", SCOPE_STAGE);
136
137
Spear->sfxSpear = RSDK.GetSfx("HCZ/Spear.wav");
138
}
139
140
void Spear_SetupHitboxes(void)
141
{
142
RSDK_THIS(Spear);
143
144
switch (self->orientation) {
145
case SPEAR_UP:
146
case SPEAR_DOWN:
147
self->hitbox.right = 4;
148
self->hitbox.bottom = 0;
149
self->hitbox.left = -4;
150
self->hitbox.top = -15 - (self->retractPos >> 16);
151
break;
152
153
case SPEAR_RIGHT:
154
case SPEAR_LEFT:
155
self->hitbox.left = 0;
156
self->hitbox.top = 64;
157
self->hitbox.right = (self->retractPos >> 16) + 15;
158
self->hitbox.bottom = 4;
159
break;
160
default: break;
161
}
162
}
163
164
#if GAME_INCLUDE_EDITOR
165
void Spear_EditorDraw(void)
166
{
167
Spear_Create(NULL);
168
Spear_Draw();
169
}
170
171
void Spear_EditorLoad(void)
172
{
173
Spear->aniFrames = RSDK.LoadSpriteAnimation("HCZ/Spear.bin", SCOPE_STAGE);
174
175
RSDK_ACTIVE_VAR(Spear, orientation);
176
RSDK_ENUM_VAR("Up", SPEAR_UP);
177
RSDK_ENUM_VAR("Right", SPEAR_RIGHT);
178
RSDK_ENUM_VAR("Down", SPEAR_DOWN);
179
RSDK_ENUM_VAR("Left", SPEAR_LEFT);
180
}
181
#endif
182
183
void Spear_Serialize(void)
184
{
185
RSDK_EDITABLE_VAR(Spear, VAR_UINT8, orientation);
186
RSDK_EDITABLE_VAR(Spear, VAR_UINT32, interval);
187
RSDK_EDITABLE_VAR(Spear, VAR_UINT32, intervalOffset);
188
RSDK_EDITABLE_VAR(Spear, VAR_UINT32, duration);
189
}
190
191