Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/GHZ/CorkscrewPath.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: CorkscrewPath Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectCorkscrewPath *CorkscrewPath;
11
12
void CorkscrewPath_Update(void)
13
{
14
RSDK_THIS(CorkscrewPath);
15
foreach_active(Player, player)
16
{
17
int32 playerID = RSDK.GetEntitySlot(player);
18
19
if (abs(self->position.x - player->position.x) >> 16 > self->xSize) {
20
self->activePlayers &= ~playerID;
21
if (player->animator.animationID != ANI_SPRING_CS)
22
player->direction &= ~FLIP_Y;
23
}
24
else {
25
int32 corkscrewPos = self->xSize + ((player->position.x - self->position.x) >> 16);
26
int32 frame = 24 * corkscrewPos / self->period;
27
int32 yOffset = self->amplitude * RSDK.Cos1024((corkscrewPos << 10) / self->period);
28
29
if (!(playerID & self->activePlayers)) {
30
if (abs(yOffset + self->position.y - player->position.y) >= 0x100000) {
31
self->activePlayers &= ~playerID;
32
}
33
else if (abs(player->groundVel) > 0x40000 && player->velocity.y > -0x40000 && player->groundedStore) {
34
player->position.y = self->position.y + yOffset;
35
player->velocity.y = 0;
36
player->onGround = true;
37
38
if (player->animator.animationID != ANI_JUMP) {
39
if (player->groundVel < 0) {
40
player->direction |= FLIP_Y;
41
RSDK.SetSpriteAnimation(player->aniFrames, ANI_SPRING_CS, &player->animator, true, CorkscrewPath->frameTable[frame]);
42
}
43
else {
44
player->direction &= ~FLIP_Y;
45
RSDK.SetSpriteAnimation(player->aniFrames, ANI_SPRING_CS, &player->animator, true, frame);
46
}
47
}
48
}
49
else {
50
self->activePlayers &= ~playerID;
51
}
52
}
53
else if (abs(player->groundVel) > 0x40000 && player->groundedStore && abs(yOffset + self->position.y - player->position.y) < 0x100000) {
54
self->activePlayers |= playerID;
55
player->position.y = yOffset + self->position.y;
56
player->velocity.y = 0;
57
player->onGround = true;
58
59
if (player->animator.animationID != ANI_JUMP) {
60
if (player->groundVel < 0) {
61
player->direction |= FLIP_Y;
62
RSDK.SetSpriteAnimation(player->aniFrames, ANI_SPRING_CS, &player->animator, true, CorkscrewPath->frameTable[frame]);
63
}
64
else {
65
player->direction &= ~FLIP_Y;
66
RSDK.SetSpriteAnimation(player->aniFrames, ANI_SPRING_CS, &player->animator, true, frame);
67
}
68
}
69
}
70
}
71
}
72
}
73
74
void CorkscrewPath_LateUpdate(void) {}
75
76
void CorkscrewPath_StaticUpdate(void) {}
77
78
void CorkscrewPath_Draw(void) {}
79
80
void CorkscrewPath_Create(void *data)
81
{
82
RSDK_THIS(CorkscrewPath);
83
84
if (!SceneInfo->inEditor) {
85
self->amplitude <<= 6;
86
self->period = abs(self->period);
87
self->xSize = self->period >> 1;
88
self->active = ACTIVE_BOUNDS;
89
self->updateRange.x = abs(self->period) << 15;
90
self->updateRange.y = self->amplitude << 3;
91
}
92
}
93
94
void CorkscrewPath_StageLoad(void) {}
95
96
#if GAME_INCLUDE_EDITOR
97
void CorkscrewPath_EditorDraw(void)
98
{
99
RSDK_THIS(CorkscrewPath);
100
RSDK.SetSpriteAnimation(CorkscrewPath->aniFrames, 0, &self->animator, true, 4);
101
RSDK.DrawSprite(&self->animator, NULL, false);
102
103
// Bounds
104
105
Vector2 size;
106
size.x = abs(self->period) << 15;
107
size.y = (self->amplitude << 6) * RSDK.Cos1024(0);
108
109
DrawHelpers_DrawRectOutline(self->position.x, self->position.y, size.x << 1, size.y << 1, 0xFFFF00);
110
}
111
112
void CorkscrewPath_EditorLoad(void) { CorkscrewPath->aniFrames = RSDK.LoadSpriteAnimation("Editor/EditorIcons.bin", SCOPE_STAGE); }
113
#endif
114
115
void CorkscrewPath_Serialize(void)
116
{
117
RSDK_EDITABLE_VAR(CorkscrewPath, VAR_ENUM, period);
118
RSDK_EDITABLE_VAR(CorkscrewPath, VAR_ENUM, amplitude);
119
RSDK_EDITABLE_VAR(CorkscrewPath, VAR_ENUM, angle);
120
}
121
122