Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/BSS/BSS_Collectable.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: BSS_Collectable Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectBSS_Collectable *BSS_Collectable;
11
12
void BSS_Collectable_Update(void) {}
13
14
void BSS_Collectable_LateUpdate(void) {}
15
16
void BSS_Collectable_StaticUpdate(void)
17
{
18
RSDK.ProcessAnimation(&BSS_Collectable->sphereAnimator[BSS_RING]);
19
RSDK.ProcessAnimation(&BSS_Collectable->sphereAnimator[BSS_RING_SPARKLE]);
20
RSDK.ProcessAnimation(&BSS_Collectable->sphereAnimator[BSS_MEDAL_SILVER]);
21
RSDK.ProcessAnimation(&BSS_Collectable->sphereAnimator[BSS_MEDAL_GOLD]);
22
}
23
24
void BSS_Collectable_Draw(void)
25
{
26
RSDK_THIS(BSS_Collectable);
27
Vector2 drawPos;
28
29
switch (self->type) {
30
case BSS_RING:
31
self->drawFX = FX_FLIP | FX_SCALE;
32
self->scale.x = BSS_Collectable->ringScaleTableX[self->animator.frameID];
33
self->scale.y = BSS_Collectable->ringScaleTableY[self->animator.frameID];
34
self->direction = BSS_Collectable->sphereAnimator[self->type].frameID > 8;
35
drawPos.x = self->position.x;
36
drawPos.y = self->position.y;
37
drawPos.y -= BSS_Collectable->screenYValues[self->animator.frameID];
38
RSDK.DrawSprite(&BSS_Collectable->sphereAnimator[self->type], &drawPos, true);
39
40
self->drawFX = FX_NONE;
41
return;
42
43
case BSS_RING_SPARKLE: RSDK.DrawSprite(&BSS_Collectable->sphereAnimator[self->type], NULL, true); break;
44
45
case BSS_EMERALD_CHAOS:
46
case BSS_EMERALD_SUPER:
47
BSS_Collectable->sphereAnimator[self->type].frameID = self->animator.frameID >> 1;
48
RSDK.DrawSprite(&BSS_Collectable->sphereAnimator[self->type], NULL, true);
49
break;
50
51
case BSS_MEDAL_SILVER:
52
case BSS_MEDAL_GOLD:
53
self->drawFX = FX_SCALE;
54
self->scale.x = BSS_Collectable->medalScaleTable[self->animator.frameID];
55
self->scale.y = BSS_Collectable->medalScaleTable[self->animator.frameID];
56
drawPos.x = self->position.x;
57
drawPos.y = self->position.y;
58
drawPos.y -= BSS_Collectable->screenYValues[self->animator.frameID];
59
RSDK.DrawSprite(&BSS_Collectable->sphereAnimator[self->type], &drawPos, true);
60
61
self->drawFX = FX_NONE;
62
break;
63
64
case BSS_SPHERE_GREEN_STOOD:
65
BSS_Collectable->sphereAnimator[BSS_SPHERE_GREEN].frameID = self->animator.frameID;
66
self->alpha = 0x80;
67
self->inkEffect = INK_ALPHA;
68
RSDK.DrawSprite(&BSS_Collectable->sphereAnimator[BSS_SPHERE_GREEN], NULL, true);
69
70
self->inkEffect = INK_NONE;
71
break;
72
73
case BSS_BLUE_STOOD:
74
BSS_Collectable->sphereAnimator[BSS_SPHERE_BLUE].frameID = self->animator.frameID;
75
self->alpha = 0x80;
76
self->inkEffect = INK_ALPHA;
77
RSDK.DrawSprite(&BSS_Collectable->sphereAnimator[BSS_SPHERE_BLUE], NULL, true);
78
79
self->inkEffect = INK_NONE;
80
break;
81
82
case BSS_SPHERE_PINK_STOOD:
83
BSS_Collectable->sphereAnimator[BSS_SPHERE_PINK].frameID = self->animator.frameID;
84
self->alpha = 0x80;
85
self->inkEffect = INK_ALPHA;
86
RSDK.DrawSprite(&BSS_Collectable->sphereAnimator[BSS_SPHERE_PINK], NULL, true);
87
88
self->inkEffect = INK_NONE;
89
break;
90
91
default:
92
BSS_Collectable->sphereAnimator[self->type].frameID = self->animator.frameID;
93
RSDK.DrawSprite(&BSS_Collectable->sphereAnimator[self->type], NULL, true);
94
break;
95
}
96
}
97
98
void BSS_Collectable_Create(void *data)
99
{
100
RSDK_THIS(BSS_Collectable);
101
102
if (!SceneInfo->inEditor) {
103
self->active = ACTIVE_NORMAL;
104
self->visible = true;
105
self->drawGroup = 3;
106
self->updateRange.x = 0x800000;
107
self->updateRange.y = 0x800000;
108
109
for (int32 i = 0; i < 8; ++i) RSDK.SetSpriteAnimation(BSS_Collectable->aniFrames, i, &BSS_Collectable->sphereAnimator[i + 1], true, 0);
110
111
RSDK.SetSpriteAnimation(BSS_Collectable->ringFrames, 0, &BSS_Collectable->sphereAnimator[BSS_RING], true, 0);
112
RSDK.SetSpriteAnimation(BSS_Collectable->ringFrames, 1, &BSS_Collectable->sphereAnimator[BSS_RING_SPARKLE], true, 0);
113
RSDK.SetSpriteAnimation(BSS_Collectable->aniFrames, 6, &BSS_Collectable->sphereAnimator[BSS_EMERALD_CHAOS], true, 0);
114
RSDK.SetSpriteAnimation(BSS_Collectable->aniFrames, 7, &BSS_Collectable->sphereAnimator[BSS_EMERALD_SUPER], true, 0);
115
RSDK.SetSpriteAnimation(BSS_Collectable->aniFrames, 8, &BSS_Collectable->sphereAnimator[BSS_MEDAL_SILVER], true, 0);
116
RSDK.SetSpriteAnimation(BSS_Collectable->aniFrames, 9, &BSS_Collectable->sphereAnimator[BSS_MEDAL_GOLD], true, 0);
117
}
118
}
119
120
void BSS_Collectable_StageLoad(void)
121
{
122
BSS_Collectable->aniFrames = RSDK.LoadSpriteAnimation("SpecialBS/StageObjects.bin", SCOPE_STAGE);
123
BSS_Collectable->ringFrames = RSDK.LoadSpriteAnimation("SpecialBS/Ring.bin", SCOPE_STAGE);
124
125
if (!BSS_Collectable->initializedTables) {
126
BSS_Collectable->initializedTables = true;
127
128
int32 id = 0x20;
129
for (int32 i = 0; i < 0x20; ++i) {
130
BSS_Collectable->ringScaleTableX[i] *= 14;
131
BSS_Collectable->ringScaleTableY[i] *= 14;
132
BSS_Collectable->medalScaleTable[i] *= 16;
133
BSS_Collectable->screenYValues[i] = id * (BSS_Collectable->ringScaleTableY[i] << 6);
134
BSS_Collectable->medalScreenYVals[i] = id * (BSS_Collectable->medalScaleTable[i] << 6);
135
136
int32 scale = i * (BSS_Collectable->ringScaleTableY[i] - BSS_Collectable->ringScaleTableX[i]);
137
int32 scaleX = BSS_Collectable->ringScaleTableX[i];
138
BSS_Collectable->ringScaleTableY[i] = scaleX + (scale >> 5);
139
140
--id;
141
}
142
}
143
}
144
145
#if GAME_INCLUDE_EDITOR
146
void BSS_Collectable_EditorDraw(void) {}
147
148
void BSS_Collectable_EditorLoad(void) {}
149
#endif
150
151
void BSS_Collectable_Serialize(void) {}
152
153