Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/Cutscene/FXWaveRing.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: FXWaveRing Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
#if MANIA_USE_PLUS
11
ObjectFXWaveRing *FXWaveRing;
12
13
void FXWaveRing_Update(void)
14
{
15
RSDK_THIS(FXWaveRing);
16
17
if (!(Zone->timer & 3)) {
18
if (self->shrinkSpeed > 0)
19
self->radiusOffset += RSDK.Rand(0, 2 * self->shrinkSpeed);
20
21
self->radius = RSDK.Rand(8, 24);
22
self->angleVel = 1;
23
self->angleVel2 = RSDK.Rand(8, 32);
24
self->angleInc = RSDK.Rand(50, 199);
25
}
26
27
self->angle = ((self->angle & 0xFF) + (self->angleVel & 0xFF)) & 0xFf;
28
self->angle2 = ((self->angle2 & 0xFF) + (self->angleVel2 & 0xFF)) & 0xFf;
29
30
StateMachine_Run(self->state);
31
32
Entity *parent = self->parent;
33
if (parent) {
34
self->position.x = parent->position.x + self->offsetPos.x;
35
self->position.y = parent->position.y + self->offsetPos.y;
36
}
37
}
38
39
void FXWaveRing_LateUpdate(void) {}
40
41
void FXWaveRing_StaticUpdate(void) {}
42
43
void FXWaveRing_Draw(void)
44
{
45
RSDK_THIS(FXWaveRing);
46
47
int32 angInc = 256 / self->pointCount;
48
uint32 color = (self->r << 16) | (self->g << 8) | (self->b << 8);
49
int32 sin = self->radius * RSDK.Sin256(self->angle2) + (self->radiusOffset << 8);
50
51
int32 x = sin * RSDK.Sin256(self->angle) + self->position.x;
52
int32 y = sin * RSDK.Cos256(self->angle) + self->position.y;
53
54
int32 angle = self->angle;
55
int32 angle2 = self->angle2;
56
int32 prevX = x;
57
int32 prevY = y;
58
for (int32 i = 0; i < self->pointCount - 1; ++i) {
59
angle += angInc;
60
angle2 += self->angleInc;
61
sin = self->radius * RSDK.Sin256(angle2) + (self->radiusOffset << 8);
62
prevX = x;
63
prevY = y;
64
x = sin * RSDK.Sin256(angle) + self->position.x;
65
y = sin * RSDK.Cos256(angle) + self->position.y;
66
RSDK.DrawLine(prevX, prevY, x, y, color, self->alpha, self->inkEffect, false);
67
68
prevX = x;
69
prevY = y;
70
}
71
72
sin = self->radius * RSDK.Sin256(self->angle2) + (self->radiusOffset << 8);
73
RSDK.DrawLine(x, y, sin * RSDK.Sin256(self->angle) + self->position.x, sin * RSDK.Cos256(self->angle) + self->position.y, color, self->alpha,
74
self->inkEffect, false);
75
}
76
77
void FXWaveRing_Create(void *data)
78
{
79
RSDK_THIS(FXWaveRing);
80
81
if (!SceneInfo->inEditor) {
82
self->visible = true;
83
self->active = ACTIVE_NORMAL;
84
self->drawGroup = Zone->objectDrawGroup[1];
85
86
self->radiusOffset = 48;
87
self->radius = 8;
88
self->angleVel = 2;
89
self->angleVel2 = 32;
90
self->angleInc = 150;
91
self->pointCount = 16;
92
93
self->inkEffect = INK_ADD;
94
self->parent = (Entity *)data;
95
self->state = FXWaveRing_State_FadeIn;
96
97
self->r = 0xF0;
98
self->g = 0xF0;
99
self->b = 0xF0;
100
}
101
}
102
103
void FXWaveRing_StageLoad(void) {}
104
void FXWaveRing_State_FadeIn(void)
105
{
106
RSDK_THIS(FXWaveRing);
107
108
if (self->alpha >= 0xC0) {
109
self->radiusOffset -= self->shrinkSpeed;
110
self->state = FXWaveRing_State_Wait;
111
}
112
else {
113
self->alpha += 0x08;
114
self->radiusOffset -= self->shrinkSpeed;
115
}
116
}
117
void FXWaveRing_State_Wait(void)
118
{
119
RSDK_THIS(FXWaveRing);
120
121
if (self->timer > 0) {
122
if (!--self->timer)
123
self->state = FXWaveRing_State_FadeOut;
124
}
125
126
self->radiusOffset -= self->shrinkSpeed;
127
}
128
void FXWaveRing_State_FadeOut(void)
129
{
130
RSDK_THIS(FXWaveRing);
131
132
self->radiusOffset -= self->shrinkSpeed;
133
134
if (self->alpha <= 0)
135
destroyEntity(self);
136
else
137
self->alpha -= 0x10;
138
}
139
140
#if GAME_INCLUDE_EDITOR
141
void FXWaveRing_EditorDraw(void) {}
142
143
void FXWaveRing_EditorLoad(void) {}
144
#endif
145
146
void FXWaveRing_Serialize(void) {}
147
#endif
148
149