Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/MMZ/ConveyorPlatform.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: ConveyorPlatform Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectConveyorPlatform *ConveyorPlatform;
11
12
void ConveyorPlatform_Update(void)
13
{
14
RSDK_THIS(ConveyorPlatform);
15
16
if (self->state == Platform_State_Path) {
17
if (self->timer || self->flipTimer) {
18
if (++self->flipTimer == 24) {
19
self->stateCollide = Platform_Collision_Solid;
20
self->collision = PLATFORM_C_SOLID;
21
self->flipTimer = 0;
22
}
23
else {
24
self->stateCollide = Platform_Collision_None;
25
self->collision = PLATFORM_C_NONE;
26
}
27
28
self->animator.frameID = ConveyorPlatform->frameIDs[self->flipTimer];
29
self->direction = ConveyorPlatform->directionIDs[self->flipTimer];
30
}
31
}
32
else {
33
if (self->flipTimer) {
34
if (++self->flipTimer >= self->flipCount) {
35
self->stateCollide = Platform_Collision_Solid;
36
self->collision = PLATFORM_C_SOLID;
37
self->flipTimer = 0;
38
}
39
40
self->animator.frameID = ConveyorPlatform->frameIDs[self->flipTimer % 24];
41
self->direction = ConveyorPlatform->directionIDs[self->flipTimer % 24];
42
}
43
44
if (!((Zone->persistentTimer + self->intervalOffset) % self->interval) && !self->flipTimer) {
45
self->stateCollide = Platform_Collision_None;
46
self->collision = PLATFORM_C_NONE;
47
self->flipTimer = 1;
48
}
49
}
50
51
Platform_Update();
52
}
53
54
void ConveyorPlatform_LateUpdate(void) {}
55
56
void ConveyorPlatform_StaticUpdate(void) {}
57
58
void ConveyorPlatform_Draw(void)
59
{
60
RSDK_THIS(ConveyorPlatform);
61
62
RSDK.DrawSprite(&self->animator, &self->drawPos, false);
63
}
64
65
void ConveyorPlatform_Create(void *data)
66
{
67
RSDK_THIS(ConveyorPlatform);
68
69
if (self->type)
70
self->type = PLATFORM_PATH;
71
72
Platform_Create(NULL);
73
74
RSDK.SetSpriteAnimation(Platform->aniFrames, 2, &self->animator, true, 0);
75
76
self->drawFX |= FX_FLIP;
77
self->stateCollide = Platform_Collision_Solid;
78
self->collision = PLATFORM_C_SOLID;
79
self->flipTimer = 0;
80
81
if (!SceneInfo->inEditor)
82
self->flipCount *= 12;
83
}
84
85
void ConveyorPlatform_StageLoad(void) {}
86
87
#if GAME_INCLUDE_EDITOR
88
void ConveyorPlatform_EditorDraw(void)
89
{
90
RSDK_THIS(ConveyorPlatform);
91
92
ConveyorPlatform_Create(NULL);
93
self->drawPos = self->position;
94
95
ConveyorPlatform_Draw();
96
97
if (showGizmos()) {
98
RSDK_DRAWING_OVERLAY(true);
99
100
for (int32 s = SceneInfo->entitySlot + 1, i = 0; i < self->childCount; ++i) {
101
Entity *child = RSDK_GET_ENTITY_GEN(s + i);
102
if (!child)
103
continue;
104
105
DrawHelpers_DrawArrow(self->position.x, self->position.y, child->position.x, child->position.y, 0xE0E0E0, INK_NONE, 0xFF);
106
}
107
108
RSDK_DRAWING_OVERLAY(false);
109
}
110
}
111
112
void ConveyorPlatform_EditorLoad(void)
113
{
114
115
RSDK_ACTIVE_VAR(ConveyorPlatform, type);
116
RSDK_ENUM_VAR("Fixed", CONVEYORPLATFORM_FIXED);
117
RSDK_ENUM_VAR("Moving", CONVEYORPLATFORM_MOVING);
118
}
119
#endif
120
121
void ConveyorPlatform_Serialize(void)
122
{
123
RSDK_EDITABLE_VAR(ConveyorPlatform, VAR_ENUM, type);
124
RSDK_EDITABLE_VAR(ConveyorPlatform, VAR_ENUM, node);
125
RSDK_EDITABLE_VAR(ConveyorPlatform, VAR_ENUM, childCount);
126
RSDK_EDITABLE_VAR(ConveyorPlatform, VAR_UINT16, interval);
127
RSDK_EDITABLE_VAR(ConveyorPlatform, VAR_UINT16, intervalOffset);
128
RSDK_EDITABLE_VAR(ConveyorPlatform, VAR_UINT16, flipCount);
129
}
130
131