Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/CPZ/Syringe.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: Syringe Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectSyringe *Syringe;
11
12
void Syringe_Update(void)
13
{
14
RSDK_THIS(Syringe);
15
16
if (self->activated) {
17
if (self->offsetY < 0x280000) {
18
self->offsetY += 0x8000;
19
if (!(Zone->timer & 3))
20
CREATE_ENTITY(Reagent, INT_TO_VOID(self->type), self->position.x, self->position.y + 0x680000);
21
}
22
23
self->active = ACTIVE_NORMAL;
24
}
25
else if (!RSDK.CheckOnScreen(self, NULL)) {
26
self->active = ACTIVE_BOUNDS;
27
self->offsetY = 0;
28
}
29
30
foreach_active(Player, player)
31
{
32
Player_CheckCollisionPlatform(player, self, &Syringe->hitboxBody);
33
self->position.y += self->offsetY;
34
35
if (Player_CheckCollisionPlatform(player, self, &Syringe->hitboxHandle)) {
36
self->activated = true;
37
player->position.y += 0x10000;
38
39
EntityCamera *camera = player->camera;
40
if (camera) {
41
if (camera->lookPos.y < 96) {
42
camera->lookPos.y += 8;
43
camera->lookPos.y = MIN(camera->lookPos.y, 80);
44
}
45
}
46
}
47
48
self->position.y -= self->offsetY;
49
}
50
}
51
52
void Syringe_LateUpdate(void) {}
53
54
void Syringe_StaticUpdate(void) {}
55
56
void Syringe_Draw(void)
57
{
58
RSDK_THIS(Syringe);
59
Vector2 drawPos;
60
61
drawPos.x = self->position.x;
62
drawPos.y = self->position.y + self->offsetY;
63
RSDK.DrawRect(drawPos.x - 0x100000, drawPos.y, 0x200000, 0x4E0000 - self->offsetY, self->color, 0xC0, INK_ALPHA, false);
64
RSDK.DrawSprite(&self->handleAnimator, &drawPos, false);
65
RSDK.DrawSprite(&self->containerAnimator, NULL, false);
66
}
67
68
void Syringe_Create(void *data)
69
{
70
RSDK_THIS(Syringe);
71
72
if (!SceneInfo->inEditor) {
73
self->visible = true;
74
self->drawGroup = Zone->objectDrawGroup[0];
75
self->active = ACTIVE_BOUNDS;
76
self->updateRange.x = 0x800000;
77
self->updateRange.y = 0x800000;
78
79
switch (self->type) {
80
case CHEMICALPOOL_BLUE: self->color = 0x0008C0; break;
81
case CHEMICALPOOL_GREEN: self->color = 0x189000; break;
82
case CHEMICALPOOL_CYAN: self->color = 0x0080B0; break;
83
}
84
85
RSDK.SetSpriteAnimation(Syringe->aniFrames, 0, &self->handleAnimator, true, 0);
86
RSDK.SetSpriteAnimation(Syringe->aniFrames, 0, &self->containerAnimator, true, 1);
87
}
88
}
89
90
void Syringe_StageLoad(void)
91
{
92
Syringe->aniFrames = RSDK.LoadSpriteAnimation("CPZ/Syringe.bin", SCOPE_STAGE);
93
94
Syringe->hitboxBody.left = -16;
95
Syringe->hitboxBody.top = 0;
96
Syringe->hitboxBody.right = 16;
97
Syringe->hitboxBody.bottom = 8;
98
99
Syringe->hitboxHandle.left = -24;
100
Syringe->hitboxHandle.top = -49;
101
Syringe->hitboxHandle.right = 24;
102
Syringe->hitboxHandle.bottom = -40;
103
104
Syringe->sfxBloop = RSDK.GetSfx("Stage/Bloop.wav");
105
}
106
107
#if GAME_INCLUDE_EDITOR
108
void Syringe_EditorDraw(void)
109
{
110
RSDK_THIS(Syringe);
111
112
switch (self->type) {
113
case CHEMICALPOOL_BLUE: self->color = 0x0008C0; break;
114
case CHEMICALPOOL_GREEN: self->color = 0x189000; break;
115
case CHEMICALPOOL_CYAN: self->color = 0x0080B0; break;
116
}
117
118
RSDK.SetSpriteAnimation(Syringe->aniFrames, 0, &self->handleAnimator, true, 0);
119
RSDK.SetSpriteAnimation(Syringe->aniFrames, 0, &self->containerAnimator, true, 1);
120
121
Syringe_Draw();
122
}
123
124
void Syringe_EditorLoad(void)
125
{
126
Syringe->aniFrames = RSDK.LoadSpriteAnimation("CPZ/Syringe.bin", SCOPE_STAGE);
127
128
RSDK_ACTIVE_VAR(Syringe, type);
129
RSDK_ENUM_VAR("Blue", CHEMICALPOOL_BLUE);
130
RSDK_ENUM_VAR("Green", CHEMICALPOOL_GREEN);
131
RSDK_ENUM_VAR("Cyan", CHEMICALPOOL_CYAN);
132
}
133
#endif
134
135
void Syringe_Serialize(void)
136
{
137
RSDK_EDITABLE_VAR(Syringe, VAR_ENUM, type);
138
RSDK_EDITABLE_VAR(Syringe, VAR_UINT8, tag);
139
}
140
141