Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/CPZ/OneWayDoor.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: OneWayDoor Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectOneWayDoor *OneWayDoor;
11
12
void OneWayDoor_Update(void)
13
{
14
RSDK_THIS(OneWayDoor);
15
16
StateMachine_Run(self->state);
17
18
RSDK.ProcessAnimation(&self->animator);
19
}
20
21
void OneWayDoor_LateUpdate(void) {}
22
23
void OneWayDoor_StaticUpdate(void) {}
24
25
void OneWayDoor_Draw(void)
26
{
27
RSDK_THIS(OneWayDoor);
28
29
StateMachine_Run(self->stateDraw);
30
}
31
32
void OneWayDoor_Create(void *data)
33
{
34
RSDK_THIS(OneWayDoor);
35
36
self->active = ACTIVE_BOUNDS;
37
self->visible = true;
38
self->updateRange.x = 0x1000000;
39
self->updateRange.y = 0x1000000;
40
self->state = OneWayDoor_State_MoveDown;
41
self->drawGroup = Zone->objectDrawGroup[1] - 2;
42
43
RSDK.SetSpriteAnimation(OneWayDoor->aniFrames, 0, &self->animator, true, 0);
44
45
if (RSDK.CheckSceneFolder("MMZ")) {
46
#if MANIA_USE_PLUS
47
RSDK.SetSpriteAnimation(OneWayDoor->aniFrames, self->direction ? 4 : 2, &self->animator, true, 0);
48
#endif
49
self->stateDraw = OneWayDoor_Draw_MMZ;
50
self->groundVel = 0x60000;
51
}
52
else if (RSDK.CheckSceneFolder("CPZ")) {
53
self->stateDraw = OneWayDoor_Draw_CPZ;
54
self->groundVel = 0x80000;
55
}
56
}
57
58
void OneWayDoor_StageLoad(void)
59
{
60
if (RSDK.CheckSceneFolder("MMZ"))
61
OneWayDoor->aniFrames = RSDK.LoadSpriteAnimation("MMZ/OneWayDoor.bin", SCOPE_STAGE);
62
else if (RSDK.CheckSceneFolder("CPZ"))
63
OneWayDoor->aniFrames = RSDK.LoadSpriteAnimation("CPZ/OneWayDoor.bin", SCOPE_STAGE);
64
65
OneWayDoor->hitboxTop.left = -8;
66
OneWayDoor->hitboxTop.top = -32;
67
OneWayDoor->hitboxTop.right = 8;
68
OneWayDoor->hitboxTop.bottom = 0;
69
70
OneWayDoor->hitboxBottom.left = -8;
71
OneWayDoor->hitboxBottom.top = 0;
72
OneWayDoor->hitboxBottom.right = 8;
73
OneWayDoor->hitboxBottom.bottom = 32;
74
75
OneWayDoor->hitboxRange.left = -64;
76
OneWayDoor->hitboxRange.top = -32;
77
OneWayDoor->hitboxRange.right = 8;
78
OneWayDoor->hitboxRange.bottom = 32;
79
}
80
81
void OneWayDoor_HandlePlayerInteractions(void)
82
{
83
RSDK_THIS(OneWayDoor);
84
85
EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);
86
87
self->state = OneWayDoor_State_MoveDown;
88
89
bool32 isMMZ1 = false;
90
if (RSDK.CheckSceneFolder("MMZ") && Zone->actID == 1)
91
isMMZ1 = true;
92
93
bool32 isBehind = false;
94
if (self->direction == FLIP_X)
95
isBehind = player1->position.x >= self->position.x;
96
else if (!self->direction)
97
isBehind = player1->position.x <= self->position.x;
98
99
foreach_active(Player, currentPlayer)
100
{
101
if (self->stateDraw != OneWayDoor_Draw_MMZ)
102
self->position.y -= 2 * self->offsetY;
103
else
104
self->position.y -= self->offsetY;
105
106
Player_CheckCollisionBox(currentPlayer, self, &OneWayDoor->hitboxTop);
107
if (self->stateDraw == OneWayDoor_Draw_MMZ)
108
self->position.y += 2 * self->offsetY;
109
110
Player_CheckCollisionBox(currentPlayer, self, &OneWayDoor->hitboxBottom);
111
if (self->stateDraw == OneWayDoor_Draw_MMZ)
112
self->position.y -= self->offsetY;
113
else
114
self->position.y += 2 * self->offsetY;
115
116
if (currentPlayer->velocity.x < 0x60000)
117
OneWayDoor->hitboxRange.left = -64;
118
else
119
OneWayDoor->hitboxRange.left = -88;
120
121
if (Player_CheckCollisionTouch(currentPlayer, self, &OneWayDoor->hitboxRange)) {
122
if (isMMZ1 && currentPlayer->sidekick && !isBehind) {
123
#if MANIA_USE_PLUS
124
Player->cantSwap = true;
125
NoSwap->counter++;
126
#endif
127
}
128
else
129
self->state = OneWayDoor_State_MoveUp;
130
}
131
}
132
}
133
134
void OneWayDoor_State_MoveDown(void)
135
{
136
RSDK_THIS(OneWayDoor);
137
138
if (self->offsetY > 0)
139
self->offsetY -= self->groundVel;
140
141
OneWayDoor_HandlePlayerInteractions();
142
}
143
144
void OneWayDoor_State_MoveUp(void)
145
{
146
RSDK_THIS(OneWayDoor);
147
148
if (self->offsetY < 0x200000)
149
self->offsetY += self->groundVel;
150
151
OneWayDoor_HandlePlayerInteractions();
152
}
153
154
void OneWayDoor_Draw_MMZ(void)
155
{
156
RSDK_THIS(OneWayDoor);
157
158
self->position.y -= self->offsetY;
159
RSDK.DrawSprite(&self->animator, NULL, false);
160
161
self->position.y += 2 * self->offsetY + 0x200000;
162
RSDK.DrawSprite(&self->animator, NULL, false);
163
164
self->position.y += -0x200000 - self->offsetY;
165
}
166
167
void OneWayDoor_Draw_CPZ(void)
168
{
169
RSDK_THIS(OneWayDoor);
170
171
self->animator.frameID = 0;
172
self->position.y -= 2 * self->offsetY;
173
RSDK.DrawSprite(&self->animator, NULL, false);
174
175
self->animator.frameID = 1;
176
RSDK.DrawSprite(&self->animator, NULL, false);
177
178
self->position.y += 2 * self->offsetY;
179
}
180
181
#if GAME_INCLUDE_EDITOR
182
void OneWayDoor_EditorDraw(void)
183
{
184
RSDK_THIS(OneWayDoor);
185
186
if (RSDK.CheckSceneFolder("MMZ")) {
187
RSDK.SetSpriteAnimation(OneWayDoor->aniFrames, self->direction ? 4 : 2, &self->animator, true, 0);
188
OneWayDoor_Draw_MMZ();
189
}
190
else if (RSDK.CheckSceneFolder("CPZ")) {
191
RSDK.SetSpriteAnimation(OneWayDoor->aniFrames, 0, &self->animator, true, 0);
192
OneWayDoor_Draw_CPZ();
193
}
194
}
195
196
void OneWayDoor_EditorLoad(void)
197
{
198
if (RSDK.CheckSceneFolder("MMZ"))
199
OneWayDoor->aniFrames = RSDK.LoadSpriteAnimation("MMZ/OneWayDoor.bin", SCOPE_STAGE);
200
else if (RSDK.CheckSceneFolder("CPZ"))
201
OneWayDoor->aniFrames = RSDK.LoadSpriteAnimation("CPZ/OneWayDoor.bin", SCOPE_STAGE);
202
203
RSDK_ACTIVE_VAR(OneWayDoor, direction);
204
RSDK_ENUM_VAR("No Flip", FLIP_NONE);
205
RSDK_ENUM_VAR("Flipped", FLIP_X);
206
}
207
#endif
208
209
void OneWayDoor_Serialize(void) { RSDK_EDITABLE_VAR(OneWayDoor, VAR_UINT8, direction); }
210