Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/Global/InvisibleBlock.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: InvisibleBlock Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectInvisibleBlock *InvisibleBlock;
11
12
void InvisibleBlock_Update(void)
13
{
14
RSDK_THIS(InvisibleBlock);
15
16
foreach_active(Player, player)
17
{
18
if ((self->planeFilter <= 0 || player->collisionPlane == (((uint8)self->planeFilter - 1) & 1)) && (!self->noChibi || !player->isChibi)) {
19
switch (Player_CheckCollisionBox(player, self, &self->hitbox)) {
20
case C_TOP:
21
if (!self->noCrush)
22
player->collisionFlagV |= 1;
23
break;
24
25
case C_LEFT:
26
if (!self->noCrush)
27
player->collisionFlagH |= 1;
28
break;
29
30
case C_RIGHT:
31
if (!self->noCrush)
32
player->collisionFlagH |= 2;
33
break;
34
35
case C_BOTTOM:
36
if (!self->noCrush)
37
player->collisionFlagV |= 2;
38
break;
39
40
default: break;
41
}
42
}
43
}
44
45
self->visible = DebugMode->debugActive;
46
}
47
48
void InvisibleBlock_LateUpdate(void) {}
49
50
void InvisibleBlock_StaticUpdate(void) {}
51
52
void InvisibleBlock_Draw(void) { InvisibleBlock_DrawSprites(); }
53
54
void InvisibleBlock_Create(void *data)
55
{
56
RSDK_THIS(InvisibleBlock);
57
58
if (!SceneInfo->inEditor) {
59
if (self->timeAttackOnly && globals->gameMode < MODE_TIMEATTACK)
60
destroyEntity(self);
61
62
self->visible = false;
63
self->active = self->activeNormal ? ACTIVE_NORMAL : ACTIVE_BOUNDS;
64
65
self->updateRange.x = (self->width + 5) << 19;
66
self->updateRange.y = (self->height + 5) << 19;
67
68
self->hitbox.right = 8 * self->width + 8;
69
self->hitbox.left = -self->hitbox.right;
70
self->hitbox.bottom = 8 * self->height + 8;
71
self->hitbox.top = -self->hitbox.bottom;
72
self->drawGroup = Zone->objectDrawGroup[1];
73
}
74
}
75
76
void InvisibleBlock_StageLoad(void)
77
{
78
InvisibleBlock->aniFrames = RSDK.LoadSpriteAnimation("Global/ItemBox.bin", SCOPE_STAGE);
79
80
RSDK.SetSpriteAnimation(InvisibleBlock->aniFrames, 2, &InvisibleBlock->animator, true, 0);
81
InvisibleBlock->animator.frameID = 10;
82
}
83
84
void InvisibleBlock_DrawSprites(void)
85
{
86
RSDK_THIS(InvisibleBlock);
87
88
Vector2 drawPos;
89
drawPos.x = self->position.x - (self->width << 19);
90
drawPos.y = self->position.y - (self->height << 19);
91
92
for (int32 y = 0; y <= self->height; ++y) {
93
for (int32 x = 0; x <= self->width; ++x) {
94
RSDK.DrawSprite(&InvisibleBlock->animator, &drawPos, false);
95
drawPos.x += TO_FIXED(16);
96
}
97
98
drawPos.x += -TO_FIXED(16) - (self->width << 20);
99
drawPos.y += TO_FIXED(16);
100
}
101
}
102
103
#if GAME_INCLUDE_EDITOR
104
void InvisibleBlock_EditorDraw(void)
105
{
106
RSDK_THIS(InvisibleBlock);
107
108
self->updateRange.x = (self->width + 5) << 19;
109
self->updateRange.y = (self->height + 5) << 19;
110
111
InvisibleBlock_DrawSprites();
112
}
113
114
void InvisibleBlock_EditorLoad(void)
115
{
116
InvisibleBlock->aniFrames = RSDK.LoadSpriteAnimation("Global/ItemBox.bin", SCOPE_STAGE);
117
RSDK.SetSpriteAnimation(InvisibleBlock->aniFrames, 2, &InvisibleBlock->animator, true, 10);
118
119
RSDK_ACTIVE_VAR(InvisibleBlock, planeFilter);
120
RSDK_ENUM_VAR("None", PLANEFILTER_NONE);
121
RSDK_ENUM_VAR("AL", PLANEFILTER_AL);
122
RSDK_ENUM_VAR("BL", PLANEFILTER_BL);
123
RSDK_ENUM_VAR("AH", PLANEFILTER_AH);
124
RSDK_ENUM_VAR("BH", PLANEFILTER_BH);
125
}
126
#endif
127
128
void InvisibleBlock_Serialize(void)
129
{
130
RSDK_EDITABLE_VAR(InvisibleBlock, VAR_UINT8, width);
131
RSDK_EDITABLE_VAR(InvisibleBlock, VAR_UINT8, height);
132
RSDK_EDITABLE_VAR(InvisibleBlock, VAR_ENUM, planeFilter);
133
RSDK_EDITABLE_VAR(InvisibleBlock, VAR_BOOL, noCrush);
134
RSDK_EDITABLE_VAR(InvisibleBlock, VAR_BOOL, activeNormal);
135
RSDK_EDITABLE_VAR(InvisibleBlock, VAR_BOOL, timeAttackOnly);
136
RSDK_EDITABLE_VAR(InvisibleBlock, VAR_BOOL, noChibi);
137
}
138
139