Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/FBZ/MagPlatform.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: MagPlatform Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectMagPlatform *MagPlatform;
11
12
void MagPlatform_Update(void) { Platform_Update(); }
13
14
void MagPlatform_LateUpdate(void) {}
15
16
void MagPlatform_StaticUpdate(void) {}
17
18
void MagPlatform_Draw(void)
19
{
20
RSDK_THIS(MagPlatform);
21
22
RSDK.DrawSprite(&self->animator, &self->drawPos, false);
23
24
self->animator.frameID = 1;
25
RSDK.GetFrame(Platform->aniFrames, 3, 1)->height = (self->centerPos.y - self->drawPos.y) >> 16;
26
RSDK.DrawSprite(&self->animator, &self->drawPos, false);
27
28
self->animator.frameID = 2;
29
RSDK.DrawSprite(&self->animator, &self->centerPos, false);
30
31
self->animator.frameID = 0;
32
}
33
34
void MagPlatform_Create(void *data)
35
{
36
RSDK_THIS(MagPlatform);
37
38
Platform_Create(NULL);
39
RSDK.SetSpriteAnimation(Platform->aniFrames, 3, &self->animator, true, 0);
40
41
if (!SceneInfo->inEditor) {
42
self->length <<= 16;
43
self->stateCollide = MagPlatform_Collide_SolidAllHazardBottom;
44
self->state = MagPlatform_State_Idle;
45
}
46
}
47
48
void MagPlatform_StageLoad(void) { MagPlatform->sfxChain = RSDK.GetSfx("Stage/Chain.wav"); }
49
50
void MagPlatform_Collide_SolidAllHazardBottom(void)
51
{
52
RSDK_THIS(MagPlatform);
53
54
Hitbox *hitbox = RSDK.GetHitbox(&self->animator, 1);
55
self->stoodPlayers = 0;
56
self->pushPlayersL = 0;
57
self->pushPlayersR = 0;
58
59
int32 playerID = 0;
60
foreach_active(Player, player)
61
{
62
bool32 groundStore = player->onGround;
63
switch (Player_CheckCollisionBox(player, self, hitbox)) {
64
case C_TOP:
65
if (!groundStore) {
66
self->stood = true;
67
if (self->state == Platform_State_Fall && !self->timer)
68
self->timer = 30;
69
self->stoodPlayers |= 1 << playerID;
70
player->position.x += self->collisionOffset.x;
71
player->position.y += self->collisionOffset.y;
72
player->position.y &= 0xFFFF0000;
73
}
74
break;
75
76
case C_LEFT:
77
if (player->onGround && player->right)
78
self->pushPlayersL |= 1 << playerID;
79
break;
80
81
case C_RIGHT:
82
if (player->onGround && player->left)
83
self->pushPlayersR |= 1 << playerID;
84
break;
85
86
case C_BOTTOM:
87
if (!player->onGround) {
88
#if MANIA_USE_PLUS
89
if (!Player_CheckMightyUnspin(player, 0x400, true, &player->uncurlTimer))
90
#endif
91
Player_Hurt(player, self);
92
}
93
else if (player->collisionMode) {
94
if (self->velocity.y > 0) {
95
Player_Hurt(player, self);
96
}
97
else {
98
#if MANIA_USE_PLUS
99
if (!Player_CheckMightyUnspin(player, 0x300, true, &player->uncurlTimer))
100
#endif
101
Player_Hurt(player, self);
102
}
103
}
104
else {
105
player->deathType = PLAYER_DEATH_DIE_USESFX;
106
}
107
break;
108
109
default: break;
110
}
111
112
playerID++;
113
}
114
}
115
116
void MagPlatform_State_Idle(void) {}
117
118
void MagPlatform_State_Rise(void)
119
{
120
RSDK_THIS(MagPlatform);
121
122
self->drawPos.y += self->velocity.y;
123
int32 posY = self->position.y;
124
125
self->position.y = self->drawPos.y;
126
self->velocity.y -= 0x3800;
127
if (RSDK.ObjectTileCollision(self, Zone->collisionLayers, CMODE_ROOF, 0, 0, -0x40000, true))
128
self->velocity.y = 0;
129
130
if (self->drawPos.y <= self->centerPos.y - self->length) {
131
self->drawPos.y = self->centerPos.y - self->length;
132
if (self->velocity.y < -0x20000)
133
RSDK.PlaySfx(MagPlatform->sfxChain, false, 255);
134
135
self->velocity.y = 0;
136
}
137
138
self->position.y = posY;
139
self->state = MagPlatform_State_Fall;
140
}
141
142
void MagPlatform_State_Fall(void)
143
{
144
RSDK_THIS(MagPlatform);
145
146
self->drawPos.y += self->velocity.y;
147
self->velocity.y += 0x3800;
148
if (self->velocity.y <= 0 && RSDK.ObjectTileCollision(self, Zone->collisionLayers, CMODE_ROOF, 0, 0, -0x40000, true))
149
self->velocity.y = 0;
150
151
if (self->drawPos.y >= self->centerPos.y) {
152
self->velocity.y = 0;
153
self->drawPos.y = self->centerPos.y;
154
self->active = ACTIVE_BOUNDS;
155
self->state = MagPlatform_State_Idle;
156
}
157
}
158
159
#if GAME_INCLUDE_EDITOR
160
void MagPlatform_EditorDraw(void)
161
{
162
RSDK_THIS(MagPlatform);
163
self->drawPos = self->centerPos = self->position;
164
165
MagPlatform_Draw();
166
167
if (showGizmos()) {
168
RSDK_DRAWING_OVERLAY(true);
169
self->inkEffect = INK_BLEND;
170
171
self->drawPos.y = self->centerPos.y - (self->length << 16);
172
MagPlatform_Draw();
173
174
self->inkEffect = INK_NONE;
175
RSDK_DRAWING_OVERLAY(false);
176
}
177
}
178
179
void MagPlatform_EditorLoad(void) {}
180
#endif
181
182
void MagPlatform_Serialize(void) { RSDK_EDITABLE_VAR(MagPlatform, VAR_ENUM, length); }
183
184