Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/LRZ/LRZConvControl.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: LRZConvControl Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectLRZConvControl *LRZConvControl;
11
12
void LRZConvControl_Update(void)
13
{
14
RSDK_THIS(LRZConvControl);
15
16
switch (self->triggerMode) {
17
case LRZCONVCTRL_TRIGGER_PLAYER: LRZConvControl_HandlePlayerTrigger(); break;
18
case LRZCONVCTRL_TRIGGER_BUTTON: LRZConvControl_HandleButtonTrigger(); break;
19
}
20
21
self->visible = DebugMode->debugActive;
22
}
23
24
void LRZConvControl_LateUpdate(void) {}
25
26
void LRZConvControl_StaticUpdate(void) {}
27
28
void LRZConvControl_Draw(void)
29
{
30
RSDK_THIS(LRZConvControl);
31
32
RSDK.SetSpriteAnimation(LRZConvControl->aniFrames, 0, &self->animator, true, 0);
33
RSDK.DrawSprite(&self->animator, NULL, false);
34
35
if (self->triggerMode == LRZCONVCTRL_TRIGGER_PLAYER) {
36
self->hitbox.left = -(self->hitboxSize.x >> 17);
37
self->hitbox.top = -(self->hitboxSize.y >> 17);
38
self->hitbox.right = self->hitboxSize.x >> 17;
39
self->hitbox.bottom = self->hitboxSize.y >> 17;
40
41
DrawHelpers_DrawHitboxOutline(self->position.x, self->position.y, &self->hitbox, self->direction, 0xFFFFFF);
42
}
43
}
44
45
void LRZConvControl_Create(void *data)
46
{
47
RSDK_THIS(LRZConvControl);
48
49
self->active = ACTIVE_BOUNDS;
50
self->drawGroup = Zone->objectDrawGroup[0];
51
self->visible = true;
52
self->drawFX = FX_FLIP;
53
self->updateRange.x = 0x800000;
54
self->updateRange.y = 0x800000;
55
56
switch (self->triggerMode) {
57
case LRZCONVCTRL_TRIGGER_PLAYER:
58
self->hitbox.left = -(self->hitboxSize.x >> 17);
59
self->hitbox.top = -(self->hitboxSize.y >> 17);
60
self->hitbox.right = self->hitboxSize.x >> 17;
61
self->hitbox.bottom = self->hitboxSize.y >> 17;
62
63
self->updateRange.x += self->hitboxSize.x;
64
self->updateRange.y += self->hitboxSize.y;
65
break;
66
67
case LRZCONVCTRL_TRIGGER_BUTTON: self->taggedButton = LRZ2Setup_SetupTagLink(self->buttonTag, (Entity *)self); break;
68
}
69
}
70
71
void LRZConvControl_StageLoad(void) { LRZConvControl->aniFrames = RSDK.LoadSpriteAnimation("LRZ2/LRZConvControl.bin", SCOPE_STAGE); }
72
73
void LRZConvControl_HandlePlayerTrigger(void)
74
{
75
RSDK_THIS(LRZConvControl);
76
77
bool32 interacted = false;
78
foreach_active(Player, player)
79
{
80
int32 playerID = RSDK.GetEntitySlot(player);
81
bool32 collided = Player_CheckCollisionTouch(player, self, &self->hitbox);
82
83
if ((1 << playerID) & self->activePlayers) {
84
if (!collided)
85
self->activePlayers &= ~(1 << playerID);
86
}
87
else {
88
if (collided) {
89
if (!player->sidekick)
90
interacted = true;
91
92
self->activePlayers |= 1 << playerID;
93
}
94
}
95
}
96
97
if (interacted) {
98
switch (self->behavior) {
99
case LRZCONVCTRL_BEHAVIOR_ONOFF_SET: LRZ2Setup->conveyorOff = self->flipVal; break;
100
case LRZCONVCTRL_BEHAVIOR_ONOFF_SWAP: LRZ2Setup->conveyorOff = !LRZ2Setup->conveyorOff; break;
101
case LRZCONVCTRL_BEHAVIOR_CHANGEDIR_SET: LRZ2Setup->conveyorDir = self->flipVal; break;
102
case LRZCONVCTRL_BEHAVIOR_CHANGEDIR_SWAP: LRZ2Setup->conveyorDir = !LRZ2Setup->conveyorDir; break;
103
default: break;
104
}
105
}
106
}
107
108
void LRZConvControl_HandleButtonTrigger(void)
109
{
110
RSDK_THIS(LRZConvControl);
111
112
if (self->buttonTag) {
113
EntityButton *button = self->taggedButton;
114
if (button) {
115
switch (self->behavior) {
116
case LRZCONVCTRL_BEHAVIOR_ONOFF_SET:
117
if (button->down)
118
LRZ2Setup->conveyorOff = self->flipVal;
119
break;
120
121
case LRZCONVCTRL_BEHAVIOR_ONOFF_SWAP:
122
if (self->wasToggled != button->toggled)
123
LRZ2Setup->conveyorOff = !LRZ2Setup->conveyorOff;
124
125
self->wasToggled = button->toggled;
126
break;
127
128
case LRZCONVCTRL_BEHAVIOR_CHANGEDIR_SET:
129
if (button->down)
130
LRZ2Setup->conveyorDir = self->flipVal;
131
break;
132
133
case LRZCONVCTRL_BEHAVIOR_CHANGEDIR_SWAP:
134
if (button->toggled != self->wasToggled)
135
LRZ2Setup->conveyorDir = !LRZ2Setup->conveyorDir;
136
137
self->wasToggled = button->toggled;
138
break;
139
default: break;
140
}
141
}
142
}
143
}
144
145
#if GAME_INCLUDE_EDITOR
146
void LRZConvControl_EditorDraw(void)
147
{
148
RSDK_THIS(LRZConvControl);
149
150
self->updateRange.x = 0x800000;
151
self->updateRange.y = 0x800000;
152
153
switch (self->triggerMode) {
154
case LRZCONVCTRL_TRIGGER_PLAYER:
155
self->updateRange.x += self->hitboxSize.x;
156
self->updateRange.y += self->hitboxSize.y;
157
break;
158
159
case LRZCONVCTRL_TRIGGER_BUTTON: break;
160
}
161
162
RSDK.SetSpriteAnimation(LRZConvControl->aniFrames, 0, &self->animator, true, 0);
163
RSDK.DrawSprite(&self->animator, NULL, false);
164
165
if (showGizmos()) {
166
switch (self->triggerMode) {
167
case LRZCONVCTRL_TRIGGER_PLAYER:
168
RSDK_DRAWING_OVERLAY(true);
169
170
self->hitbox.left = -(self->hitboxSize.x >> 17);
171
self->hitbox.top = -(self->hitboxSize.y >> 17);
172
self->hitbox.right = self->hitboxSize.x >> 17;
173
self->hitbox.bottom = self->hitboxSize.y >> 17;
174
DrawHelpers_DrawHitboxOutline(self->position.x, self->position.y, &self->hitbox, self->direction, 0xFFFFFF);
175
RSDK_DRAWING_OVERLAY(false);
176
break;
177
178
case LRZCONVCTRL_TRIGGER_BUTTON:
179
RSDK_DRAWING_OVERLAY(true);
180
self->taggedButton = LRZ2Setup_SetupTagLink(self->buttonTag, (Entity *)self);
181
if (self->taggedButton) {
182
DrawHelpers_DrawArrow(self->taggedButton->position.x, self->taggedButton->position.y, self->position.x, self->position.y,
183
0xFFFF00, INK_NONE, 0xFF);
184
}
185
RSDK_DRAWING_OVERLAY(false);
186
break;
187
}
188
}
189
}
190
191
void LRZConvControl_EditorLoad(void)
192
{
193
LRZConvControl->aniFrames = RSDK.LoadSpriteAnimation("LRZ2/LRZConvControl.bin", SCOPE_STAGE);
194
195
RSDK_ACTIVE_VAR(LRZConvControl, triggerMode);
196
RSDK_ENUM_VAR("Player", LRZCONVCTRL_TRIGGER_PLAYER);
197
RSDK_ENUM_VAR("Button", LRZCONVCTRL_TRIGGER_BUTTON);
198
199
RSDK_ACTIVE_VAR(LRZConvControl, behavior);
200
RSDK_ENUM_VAR("On/Off (Set)", LRZCONVCTRL_BEHAVIOR_ONOFF_SET);
201
RSDK_ENUM_VAR("On/Off (Swap)", LRZCONVCTRL_BEHAVIOR_ONOFF_SWAP);
202
RSDK_ENUM_VAR("Change Dir (Set)", LRZCONVCTRL_BEHAVIOR_CHANGEDIR_SET);
203
RSDK_ENUM_VAR("Change Dir (Swap)", LRZCONVCTRL_BEHAVIOR_CHANGEDIR_SWAP);
204
}
205
#endif
206
207
void LRZConvControl_Serialize(void)
208
{
209
RSDK_EDITABLE_VAR(LRZConvControl, VAR_UINT8, triggerMode);
210
RSDK_EDITABLE_VAR(LRZConvControl, VAR_ENUM, buttonTag);
211
RSDK_EDITABLE_VAR(LRZConvControl, VAR_VECTOR2, hitboxSize);
212
RSDK_EDITABLE_VAR(LRZConvControl, VAR_UINT8, behavior);
213
RSDK_EDITABLE_VAR(LRZConvControl, VAR_UINT8, flipVal);
214
}
215
216