Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/Unused/SpearBlock.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: SpearBlock Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectSpearBlock *SpearBlock = NULL;
11
12
void SpearBlock_Update(void)
13
{
14
RSDK_THIS(SpearBlock);
15
StateMachine_Run(self->state);
16
SpearBlock_CheckPlayerCollisions();
17
18
if (!RSDK.CheckOnScreen(self, &self->updateRange)) {
19
self->state = SpearBlock_State_SetupSpears;
20
SpearBlock_Create(NULL);
21
}
22
}
23
24
void SpearBlock_LateUpdate(void) {}
25
26
void SpearBlock_StaticUpdate(void) {}
27
28
void SpearBlock_Draw(void)
29
{
30
RSDK_THIS(SpearBlock);
31
RSDK.DrawSprite(&self->animator, &self->spearPos, false);
32
RSDK.DrawSprite(&SpearBlock->animator, NULL, false);
33
}
34
35
void SpearBlock_Create(void *data)
36
{
37
RSDK_THIS(SpearBlock);
38
self->visible = true;
39
self->drawGroup = Zone->objectDrawGroup[0];
40
self->spearPos.x = self->position.x;
41
self->spearPos.y = self->position.y;
42
self->active = ACTIVE_BOUNDS;
43
self->updateRange.x = 0x400000;
44
self->updateRange.y = 0x400000;
45
RSDK.SetSpriteAnimation(SpearBlock->aniFrames, 1, &self->animator, true, 0);
46
RSDK.SetSpriteAnimation(SpearBlock->aniFrames, 0, &SpearBlock->animator, true, 0);
47
self->state = SpearBlock_State_SetupSpears;
48
}
49
50
void SpearBlock_StageLoad(void)
51
{
52
SpearBlock->aniFrames = RSDK.LoadSpriteAnimation("Blueprint/SpearBlock.bin", SCOPE_STAGE);
53
54
SpearBlock->blockHitbox.left = -16;
55
SpearBlock->blockHitbox.top = -16;
56
SpearBlock->blockHitbox.right = 16;
57
SpearBlock->blockHitbox.bottom = 16;
58
59
SpearBlock->spearHitboxes[0].left = -4;
60
SpearBlock->spearHitboxes[0].top = -16;
61
SpearBlock->spearHitboxes[0].right = 4;
62
SpearBlock->spearHitboxes[0].bottom = 16;
63
64
SpearBlock->spearHitboxes[1].left = -16;
65
SpearBlock->spearHitboxes[1].top = -4;
66
SpearBlock->spearHitboxes[1].right = 16;
67
SpearBlock->spearHitboxes[1].bottom = 4;
68
69
SpearBlock->spearHitboxes[2].left = -4;
70
SpearBlock->spearHitboxes[2].top = -16;
71
SpearBlock->spearHitboxes[2].right = 4;
72
SpearBlock->spearHitboxes[2].bottom = 16;
73
74
SpearBlock->spearHitboxes[3].left = -16;
75
SpearBlock->spearHitboxes[3].top = -4;
76
SpearBlock->spearHitboxes[3].right = 16;
77
SpearBlock->spearHitboxes[3].bottom = 4;
78
79
DEBUGMODE_ADD_OBJ(SpearBlock);
80
}
81
82
void SpearBlock_DebugDraw(void)
83
{
84
RSDK.SetSpriteAnimation(SpearBlock->aniFrames, 0, &DebugMode->animator, true, 0);
85
RSDK.DrawSprite(&DebugMode->animator, NULL, false);
86
}
87
void SpearBlock_DebugSpawn(void)
88
{
89
RSDK_THIS(DebugMode);
90
91
CREATE_ENTITY(SpearBlock, NULL, self->position.x, self->position.y);
92
}
93
94
void SpearBlock_CheckPlayerCollisions(void)
95
{
96
RSDK_THIS(SpearBlock);
97
98
foreach_active(Player, player)
99
{
100
Player_CheckCollisionBox(player, self, &SpearBlock->blockHitbox);
101
Vector2 storePos = self->position;
102
self->position.x = self->spearPos.x;
103
self->position.y = self->spearPos.y;
104
105
if (Player_CheckCollisionTouch(player, self, &SpearBlock->spearHitboxes[self->animator.frameID])) {
106
self->position = storePos;
107
Player_HurtFlip(player);
108
}
109
self->position = storePos;
110
}
111
}
112
113
void SpearBlock_State_SetupSpears(void)
114
{
115
RSDK_THIS(SpearBlock);
116
117
self->active = ACTIVE_NORMAL;
118
self->state = SpearBlock_State_SpearRetracted;
119
if (!(Zone->timer & 0x7F)) {
120
int32 frameTimer = (Zone->timer >> 7) + self->spearDir;
121
self->timer = 4;
122
self->state = SpearBlock_State_ExtendSpears;
123
self->animator.frameID = (frameTimer & 3);
124
}
125
}
126
127
void SpearBlock_State_SpearRetracted(void)
128
{
129
RSDK_THIS(SpearBlock);
130
if (!(Zone->timer & 0x7F)) {
131
int32 frameTimer = (Zone->timer >> 7) + self->spearDir;
132
self->timer = 4;
133
self->state = SpearBlock_State_ExtendSpears;
134
self->animator.frameID = frameTimer & 3;
135
// Spear Sfx should be played here, it's prolly not here in the code since this is just a test object, nothing more.
136
}
137
}
138
139
void SpearBlock_State_ExtendSpears(void)
140
{
141
RSDK_THIS(SpearBlock);
142
switch (self->animator.frameID) {
143
case 0: self->spearPos.y -= 0x80000; break;
144
case 1: self->spearPos.x += 0x80000; break;
145
case 2: self->spearPos.y += 0x80000; break;
146
case 3: self->spearPos.x -= 0x80000; break;
147
default: break;
148
}
149
150
self->timer--;
151
if (!self->timer)
152
self->state = SpearBlock_State_SpearExtended;
153
}
154
155
void SpearBlock_State_SpearExtended(void)
156
{
157
RSDK_THIS(SpearBlock);
158
if (!(Zone->timer & 0x3F)) {
159
self->timer = 4;
160
self->state = SpearBlock_State_RetractSpears;
161
// Spear Sfx should be played here, it's prolly not here in the code since this is just a test object, nothing more.
162
}
163
}
164
165
void SpearBlock_State_RetractSpears(void)
166
{
167
RSDK_THIS(SpearBlock);
168
switch (self->animator.frameID) {
169
case 0: self->spearPos.y += 0x80000; break;
170
case 1: self->spearPos.x -= 0x80000; break;
171
case 2: self->spearPos.y -= 0x80000; break;
172
case 3: self->spearPos.x += 0x80000; break;
173
default: break;
174
}
175
176
self->timer--;
177
if (!self->timer)
178
self->state = SpearBlock_State_SpearRetracted;
179
}
180
181
#if GAME_INCLUDE_EDITOR
182
void SpearBlock_EditorDraw(void)
183
{
184
RSDK_THIS(SpearBlock);
185
self->spearPos.x = self->position.x;
186
self->spearPos.y = self->position.y;
187
188
RSDK.SetSpriteAnimation(SpearBlock->aniFrames, 1, &self->animator, true, self->spearDir & 3);
189
RSDK.SetSpriteAnimation(SpearBlock->aniFrames, 0, &SpearBlock->animator, true, 0);
190
191
switch (self->animator.frameID) {
192
case 0: self->spearPos.y -= 0x200000; break;
193
case 1: self->spearPos.x += 0x200000; break;
194
case 2: self->spearPos.y += 0x200000; break;
195
case 3: self->spearPos.x -= 0x200000; break;
196
default: break;
197
}
198
199
RSDK.DrawSprite(&self->animator, &self->spearPos, false);
200
RSDK.DrawSprite(&SpearBlock->animator, NULL, false);
201
}
202
203
void SpearBlock_EditorLoad(void)
204
{
205
SpearBlock->aniFrames = RSDK.LoadSpriteAnimation("Blueprint/SpearBlock.bin", SCOPE_STAGE);
206
207
RSDK_ACTIVE_VAR(SpearBlock, spearDir);
208
RSDK_ENUM_VAR("Up", FLIP_NONE);
209
RSDK_ENUM_VAR("Left", FLIP_X);
210
RSDK_ENUM_VAR("Down", FLIP_Y);
211
RSDK_ENUM_VAR("Right", FLIP_XY);
212
}
213
#endif
214
215
void SpearBlock_Serialize(void) { RSDK_EDITABLE_VAR(SpearBlock, VAR_UINT8, spearDir); }
216
217