Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/AIZ/AIZRockPile.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: AIZRockPile Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
#if MANIA_USE_PLUS
11
ObjectAIZRockPile *AIZRockPile;
12
13
void AIZRockPile_Update(void)
14
{
15
RSDK_THIS(AIZRockPile);
16
17
Hitbox *hitbox = RSDK.GetHitbox(&self->animator, 1);
18
19
foreach_active(Player, player)
20
{
21
if (self->onlyMighty && player->characterID != ID_MIGHTY) {
22
if (!self->onlyKnux || player->characterID != ID_KNUCKLES) {
23
Player_CheckCollisionBox(player, self, hitbox);
24
continue;
25
}
26
}
27
else if ((self->onlyKnux && player->characterID != ID_KNUCKLES) && (!self->onlyMighty || player->characterID != ID_MIGHTY)) {
28
Player_CheckCollisionBox(player, self, hitbox);
29
continue;
30
}
31
32
int32 cMode = player->collisionMode;
33
int32 playerX = player->position.x;
34
int32 playerY = player->position.y;
35
int32 xVelocity = player->velocity.x;
36
int32 yVelocity = player->velocity.y;
37
int32 jumping = player->animator.animationID == ANI_JUMP;
38
int32 groundVel = player->groundVel;
39
40
int32 side = Player_CheckCollisionBox(player, self, hitbox);
41
if (side == C_LEFT || side == C_RIGHT) {
42
bool32 canBreak = jumping && player->onGround && abs(groundVel) >= 0x48000;
43
if (player->shield == SHIELD_FIRE) {
44
EntityShield *shield = RSDK_GET_ENTITY(Player->playerCount + RSDK.GetEntitySlot(player), Shield);
45
canBreak |= shield->shieldAnimator.animationID == SHIELDANI_FIREATTACK;
46
}
47
48
canBreak |= player->characterID == ID_SONIC && player->superState == SUPERSTATE_SUPER;
49
if (!player->sidekick && (canBreak || (player->characterID == ID_KNUCKLES))) {
50
player->position.x = playerX;
51
player->position.y = playerY;
52
player->velocity.x = xVelocity;
53
player->velocity.y = yVelocity;
54
player->groundVel = groundVel;
55
if (xVelocity <= 0)
56
AIZRockPile_SpawnRocks(self->rockSpeedsL);
57
else
58
AIZRockPile_SpawnRocks(self->rockSpeedsR);
59
60
foreach_return;
61
}
62
}
63
64
if (side == C_TOP && (!self->onlyMighty || (player->characterID == ID_MIGHTY && player->animator.animationID == ANI_HAMMERDROP))) {
65
bool32 canBreak = jumping;
66
canBreak |= player->characterID == ID_SONIC && player->animator.animationID == ANI_DROPDASH;
67
canBreak |= player->characterID == ID_MIGHTY && player->state == Player_State_MightyHammerDrop;
68
if (player->groundedStore && cMode != CMODE_LWALL && cMode != CMODE_RWALL)
69
canBreak = false;
70
71
if (canBreak && !player->sidekick) {
72
player->onGround = false;
73
if (player->characterID == ID_MIGHTY && player->state == Player_State_MightyHammerDrop)
74
player->velocity.y = yVelocity - 0x10000;
75
else
76
player->velocity.y = -0x30000;
77
AIZRockPile_SpawnRocks(self->rockSpeedsT);
78
foreach_return;
79
}
80
}
81
}
82
}
83
84
void AIZRockPile_LateUpdate(void) {}
85
86
void AIZRockPile_StaticUpdate(void) {}
87
88
void AIZRockPile_Draw(void)
89
{
90
RSDK_THIS(AIZRockPile);
91
RSDK.DrawSprite(&self->animator, NULL, false);
92
}
93
94
void AIZRockPile_Create(void *data)
95
{
96
RSDK_THIS(AIZRockPile);
97
98
RSDK.SetSpriteAnimation(AIZRockPile->aniFrames, 0, &self->animator, true, self->size + 3);
99
100
if (!SceneInfo->inEditor) {
101
switch (self->size) {
102
case AIZROCKPILE_SMALL:
103
self->size = 4;
104
self->rockPositions = AIZRockPile->rockPositions_small;
105
self->rockSpeedsT = AIZRockPile->rockSpeedsT_small;
106
self->rockSpeedsL = AIZRockPile->rockSpeedsL_small;
107
self->rockSpeedsR = AIZRockPile->rockSpeedsR_small;
108
break;
109
110
case AIZROCKPILE_MED:
111
self->size = 5;
112
self->rockPositions = AIZRockPile->rockPositions_med;
113
self->rockSpeedsT = AIZRockPile->rockSpeedsT_med;
114
self->rockSpeedsL = AIZRockPile->rockSpeedsL_med;
115
self->rockSpeedsR = AIZRockPile->rockSpeedsR_med;
116
break;
117
118
case AIZROCKPILE_BIG:
119
self->size = 8;
120
self->rockPositions = AIZRockPile->rockPositions_large;
121
self->rockSpeedsT = AIZRockPile->rockSpeedsT_large;
122
self->rockSpeedsL = AIZRockPile->rockSpeedsL_large;
123
self->rockSpeedsR = AIZRockPile->rockSpeedsR_large;
124
break;
125
}
126
127
self->active = ACTIVE_BOUNDS;
128
self->visible = true;
129
self->drawGroup = Zone->objectDrawGroup[0];
130
self->updateRange.x = 0x800000;
131
self->updateRange.y = 0x800000;
132
}
133
}
134
135
void AIZRockPile_StageLoad(void)
136
{
137
AIZRockPile->aniFrames = RSDK.LoadSpriteAnimation("AIZ/Platform.bin", SCOPE_STAGE);
138
139
AIZRockPile->sfxBreak = RSDK.GetSfx("Stage/LedgeBreak3.wav");
140
}
141
142
void AIZRockPile_SpawnRocks(int32 *speeds)
143
{
144
RSDK_THIS(AIZRockPile);
145
146
for (int32 i = 0; i < self->size; ++i) {
147
EntityDebris *debris = CREATE_ENTITY(Debris, Debris_State_Fall, self->position.x + self->rockPositions[2 * i],
148
self->position.y + self->rockPositions[(2 * i) + 1]);
149
RSDK.SetSpriteAnimation(AIZRockPile->aniFrames, 1, &debris->animator, true, 0);
150
debris->velocity.x = speeds[2 * i];
151
debris->velocity.y = speeds[(2 * i) + 1];
152
debris->drawGroup = Zone->objectDrawGroup[1];
153
debris->updateRange.x = 0x800000;
154
debris->updateRange.y = 0x800000;
155
debris->gravityStrength = 0x1800;
156
}
157
158
RSDK.PlaySfx(AIZRockPile->sfxBreak, false, 255);
159
destroyEntity(self);
160
}
161
162
#if GAME_INCLUDE_EDITOR
163
void AIZRockPile_EditorDraw(void)
164
{
165
RSDK_THIS(AIZRockPile);
166
RSDK.SetSpriteAnimation(AIZRockPile->aniFrames, 0, &self->animator, true, self->size + 3);
167
168
AIZRockPile_Draw();
169
}
170
171
void AIZRockPile_EditorLoad(void)
172
{
173
AIZRockPile->aniFrames = RSDK.LoadSpriteAnimation("AIZ/Platform.bin", SCOPE_STAGE);
174
175
RSDK_ACTIVE_VAR(AIZRockPile, size);
176
RSDK_ENUM_VAR("Small", AIZROCKPILE_SMALL);
177
RSDK_ENUM_VAR("Medium", AIZROCKPILE_MED);
178
RSDK_ENUM_VAR("Large", AIZROCKPILE_BIG);
179
}
180
#endif
181
182
void AIZRockPile_Serialize(void)
183
{
184
RSDK_EDITABLE_VAR(AIZRockPile, VAR_ENUM, size);
185
RSDK_EDITABLE_VAR(AIZRockPile, VAR_BOOL, smashTop);
186
RSDK_EDITABLE_VAR(AIZRockPile, VAR_BOOL, smashSides);
187
RSDK_EDITABLE_VAR(AIZRockPile, VAR_BOOL, onlyKnux);
188
RSDK_EDITABLE_VAR(AIZRockPile, VAR_BOOL, onlyMighty);
189
}
190
#endif
191
192