Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/LRZ/HPZEmerald.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: HPZEmerald Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectHPZEmerald *HPZEmerald;
11
12
void HPZEmerald_Update(void)
13
{
14
RSDK_THIS(HPZEmerald);
15
16
RSDK.ProcessAnimation(&self->emeraldAnimator);
17
18
if (self->solid) {
19
if (self->type != HPZEMERALD_MASTER) {
20
foreach_active(Player, player) { Player_CheckCollisionPlatform(player, self, self->hitbox); }
21
}
22
23
foreach_active(HeavyKing, king)
24
{
25
if (king->bodyAnimator.animationID != 5 && !king->onGround
26
&& RSDK.CheckObjectCollisionPlatform(self, self->hitbox, king, &HeavyKing->hitboxBody, true)) {
27
Camera_ShakeScreen(0, 0, 3);
28
RSDK.PlaySfx(HeavyKing->sfxImpact2, false, 255);
29
}
30
}
31
}
32
33
if (!self->onGround) {
34
self->velocity.y += 0x3800;
35
self->position.y += self->velocity.y;
36
37
if (self->position.y >= self->startPos.y && self->velocity.y > 0) {
38
self->position.y = self->startPos.y;
39
self->velocity.y = -(self->velocity.y >> 1);
40
41
if (!self->velocity.y)
42
self->onGround = true;
43
}
44
}
45
}
46
47
void HPZEmerald_LateUpdate(void) {}
48
49
void HPZEmerald_StaticUpdate(void) {}
50
51
void HPZEmerald_Draw(void)
52
{
53
RSDK_THIS(HPZEmerald);
54
55
self->inkEffect = INK_NONE;
56
57
if (self->solid) {
58
RSDK.DrawSprite(&self->emeraldAnimator, NULL, false);
59
}
60
else {
61
RSDK.DrawSprite(&self->emeraldAnimator, NULL, false);
62
63
self->inkEffect = INK_ADD;
64
RSDK.DrawSprite(&self->overlayAnimator, NULL, false);
65
}
66
}
67
68
void HPZEmerald_Create(void *data)
69
{
70
RSDK_THIS(HPZEmerald);
71
72
if (!SceneInfo->inEditor) {
73
self->visible = true;
74
75
switch (self->type) {
76
default:
77
case HPZEMERALD_MASTER: self->drawGroup = 1; break;
78
79
case HPZEMERALD_EMERALD_LOW:
80
self->solid = true;
81
self->drawGroup = Zone->objectDrawGroup[0];
82
break;
83
84
case HPZEMERALD_EMERALD_HIGH:
85
self->solid = true;
86
self->drawGroup = Zone->objectDrawGroup[1];
87
break;
88
}
89
90
self->startPos = self->position;
91
self->active = ACTIVE_BOUNDS;
92
self->updateRange.x = 0x800000;
93
self->updateRange.y = 0x800000;
94
self->onGround = true;
95
96
if (self->type != HPZEMERALD_MASTER) {
97
RSDK.SetSpriteAnimation(HPZEmerald->aniFrames, 1, &self->emeraldAnimator, true, 0);
98
}
99
else {
100
RSDK.SetSpriteAnimation(HPZEmerald->aniFrames, 0, &self->emeraldAnimator, true, 0);
101
RSDK.SetSpriteAnimation(HPZEmerald->aniFrames, 0, &self->overlayAnimator, true, 1);
102
}
103
104
self->hitbox = RSDK.GetHitbox(&self->emeraldAnimator, 0);
105
}
106
}
107
108
void HPZEmerald_StageLoad(void) { HPZEmerald->aniFrames = RSDK.LoadSpriteAnimation("LRZ3/Emerald.bin", SCOPE_STAGE); }
109
110
#if GAME_INCLUDE_EDITOR
111
void HPZEmerald_EditorDraw(void)
112
{
113
RSDK_THIS(HPZEmerald);
114
115
self->solid = false;
116
switch (self->type) {
117
default:
118
case HPZEMERALD_MASTER:
119
case HPZEMERALD_EMERALD_LOW: self->solid = true; break;
120
121
case HPZEMERALD_EMERALD_HIGH: self->solid = true; break;
122
}
123
124
if (self->type) {
125
RSDK.SetSpriteAnimation(HPZEmerald->aniFrames, 1, &self->emeraldAnimator, true, 0);
126
}
127
else {
128
RSDK.SetSpriteAnimation(HPZEmerald->aniFrames, 0, &self->emeraldAnimator, true, 0);
129
RSDK.SetSpriteAnimation(HPZEmerald->aniFrames, 0, &self->overlayAnimator, true, 1);
130
}
131
132
HPZEmerald_Draw();
133
}
134
135
void HPZEmerald_EditorLoad(void)
136
{
137
HPZEmerald->aniFrames = RSDK.LoadSpriteAnimation("LRZ3/Emerald.bin", SCOPE_STAGE);
138
139
RSDK_ACTIVE_VAR(HPZEmerald, type);
140
RSDK_ENUM_VAR("Master Emerald", HPZEMERALD_MASTER);
141
RSDK_ENUM_VAR("Stone Emerald (Low Group)", HPZEMERALD_EMERALD_LOW);
142
RSDK_ENUM_VAR("Stone Emerald (High Group)", HPZEMERALD_EMERALD_HIGH);
143
}
144
#endif
145
146
void HPZEmerald_Serialize(void) { RSDK_EDITABLE_VAR(HPZEmerald, VAR_UINT8, type); }
147
148