Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/ERZ/PhantomRuby.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: PhantomRuby Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectPhantomRuby *PhantomRuby;
11
12
void PhantomRuby_Update(void)
13
{
14
RSDK_THIS(PhantomRuby);
15
16
StateMachine_Run(self->state);
17
18
// flash
19
if (self->rubyAnimator.animationID == 1 && self->rubyAnimator.frameID == self->rubyAnimator.frameCount - 1)
20
RSDK.SetSpriteAnimation(PhantomRuby->aniFrames, 0, &self->rubyAnimator, true, 0);
21
22
// flash add
23
if (self->flashAnimator.animationID == 2 && self->flashAnimator.frameID == self->flashAnimator.frameCount - 1)
24
RSDK.SetSpriteAnimation(-1, 0xFFFF, &self->flashAnimator, true, 0);
25
26
RSDK.ProcessAnimation(&self->rubyAnimator);
27
RSDK.ProcessAnimation(&self->flashAnimator);
28
}
29
30
void PhantomRuby_LateUpdate(void) {}
31
32
void PhantomRuby_StaticUpdate(void) {}
33
34
void PhantomRuby_Draw(void)
35
{
36
RSDK_THIS(PhantomRuby);
37
38
RSDK.DrawSprite(&self->rubyAnimator, NULL, false);
39
40
if (self->flashAnimator.animationID != -1) {
41
self->inkEffect = INK_ADD;
42
self->alpha = 0xFF;
43
RSDK.DrawSprite(&self->flashAnimator, NULL, false);
44
45
self->inkEffect = INK_NONE;
46
}
47
}
48
49
void PhantomRuby_Create(void *data)
50
{
51
RSDK_THIS(PhantomRuby);
52
53
self->active = ACTIVE_BOUNDS;
54
if (!SceneInfo->inEditor)
55
self->drawGroup = Zone->objectDrawGroup[1];
56
57
self->startPos = self->position;
58
self->visible = true;
59
self->drawFX = FX_FLIP;
60
self->updateRange.x = TO_FIXED(128);
61
self->updateRange.y = TO_FIXED(128);
62
self->state = PhantomRuby_State_FinishedFlash;
63
64
RSDK.SetSpriteAnimation(PhantomRuby->aniFrames, 0, &self->rubyAnimator, true, 0);
65
}
66
67
void PhantomRuby_StageLoad(void)
68
{
69
PhantomRuby->aniFrames = RSDK.LoadSpriteAnimation("Global/PhantomRuby.bin", SCOPE_STAGE);
70
71
PhantomRuby->sfxL[RUBYSFX_ATTACK1 - 1] = RSDK.GetSfx("Ruby/Attack1_L.wav");
72
PhantomRuby->sfxR[RUBYSFX_ATTACK1 - 1] = RSDK.GetSfx("Ruby/Attack1_R.wav");
73
PhantomRuby->sfxL[RUBYSFX_ATTACK2 - 1] = RSDK.GetSfx("Ruby/Attack2_L.wav");
74
PhantomRuby->sfxR[RUBYSFX_ATTACK2 - 1] = RSDK.GetSfx("Ruby/Attack2_R.wav");
75
PhantomRuby->sfxL[RUBYSFX_ATTACK3 - 1] = RSDK.GetSfx("Ruby/Attack3_L.wav");
76
PhantomRuby->sfxR[RUBYSFX_ATTACK3 - 1] = RSDK.GetSfx("Ruby/Attack3_R.wav");
77
PhantomRuby->sfxL[RUBYSFX_ATTACK4 - 1] = RSDK.GetSfx("Ruby/Attack4_L.wav");
78
PhantomRuby->sfxR[RUBYSFX_ATTACK4 - 1] = RSDK.GetSfx("Ruby/Attack4_R.wav");
79
PhantomRuby->sfxL[RUBYSFX_ATTACK5 - 1] = RSDK.GetSfx("Ruby/Attack5_L.wav");
80
PhantomRuby->sfxR[RUBYSFX_ATTACK5 - 1] = RSDK.GetSfx("Ruby/Attack5_R.wav");
81
PhantomRuby->sfxL[RUBYSFX_ATTACK6 - 1] = RSDK.GetSfx("Ruby/Attack6_L.wav");
82
PhantomRuby->sfxR[RUBYSFX_ATTACK6 - 1] = RSDK.GetSfx("Ruby/Attack6_R.wav");
83
PhantomRuby->sfxL[RUBYSFX_REDCUBE - 1] = RSDK.GetSfx("Ruby/RedCube_L.wav");
84
PhantomRuby->sfxR[RUBYSFX_REDCUBE - 1] = RSDK.GetSfx("Ruby/RedCube_R.wav");
85
}
86
87
void PhantomRuby_PlaySfx(uint8 sfxID)
88
{
89
if (sfxID) {
90
int32 channel = RSDK.PlaySfx(PhantomRuby->sfxL[sfxID - 1], false, 0x00);
91
RSDK.SetChannelAttributes(channel, 1.0, -1.0, 1.0);
92
93
channel = RSDK.PlaySfx(PhantomRuby->sfxR[sfxID - 1], false, 0x00);
94
RSDK.SetChannelAttributes(channel, 1.0, 1.0, 1.0);
95
}
96
}
97
98
void PhantomRuby_SetupFlash(EntityPhantomRuby *ruby)
99
{
100
ruby->flashFinished = false;
101
ruby->hasFlashed = false;
102
ruby->timer = 0;
103
104
RSDK.SetSpriteAnimation(PhantomRuby->aniFrames, 1, &ruby->rubyAnimator, true, 0);
105
RSDK.SetSpriteAnimation(PhantomRuby->aniFrames, 2, &ruby->flashAnimator, true, 0);
106
107
ruby->state = PhantomRuby_State_PlaySfx;
108
}
109
110
void PhantomRuby_State_FinishedFlash(void)
111
{
112
RSDK_THIS(PhantomRuby);
113
114
if (self->flashFinished)
115
self->flashFinished = false;
116
}
117
118
void PhantomRuby_State_PlaySfx(void)
119
{
120
RSDK_THIS(PhantomRuby);
121
122
if (self->timer == 38) {
123
PhantomRuby_PlaySfx(self->sfx);
124
125
self->flashFinished = true;
126
self->hasFlashed = true;
127
self->timer = 0;
128
self->state = PhantomRuby_State_FinishedFlash;
129
}
130
else {
131
self->timer++;
132
}
133
}
134
135
void PhantomRuby_State_Oscillate(void)
136
{
137
RSDK_THIS(PhantomRuby);
138
139
self->position.y = BadnikHelpers_Oscillate(self->startPos.y, 2, 10);
140
}
141
142
void PhantomRuby_State_MoveGravity(void)
143
{
144
RSDK_THIS(PhantomRuby);
145
146
self->position.x += self->velocity.x;
147
self->position.y += self->velocity.y;
148
self->velocity.y += 0x3800;
149
150
if (self->position.y > (Zone->cameraBoundsB[0] + 64) << 16)
151
self->state = StateMachine_None;
152
}
153
154
void PhantomRuby_State_MoveRotateGravity(void)
155
{
156
RSDK_THIS(PhantomRuby);
157
158
self->position.x += self->velocity.x;
159
self->position.y += self->velocity.y;
160
self->velocity.y += 0x3800;
161
162
self->rotation = (self->rotation + 5) & 0x1FF;
163
}
164
165
void PhantomRuby_State_MoveRotateGravity_CheckGround(void)
166
{
167
RSDK_THIS(PhantomRuby);
168
169
PhantomRuby_State_MoveRotateGravity();
170
171
if (RSDK.ObjectTileCollision(self, Zone->collisionLayers, CMODE_FLOOR, 0, 0, TO_FIXED(8), true)) {
172
self->velocity.x >>= 1;
173
if (-(self->velocity.y >> 1) > -TO_FIXED(1))
174
self->velocity.y = 0;
175
else
176
self->velocity.y = -(self->velocity.y >> 1);
177
}
178
}
179
180
#if MANIA_USE_PLUS
181
void PhantomRuby_State_MoveToPos(void)
182
{
183
RSDK_THIS(PhantomRuby);
184
185
int32 rx = (self->startPos.x - self->position.x) >> 16;
186
int32 ry = (self->startPos.y - self->position.y) >> 16;
187
int32 angle = RSDK.ATan2(rx, ry);
188
189
self->velocity.x += RSDK.Cos256(angle) << 3;
190
self->velocity.y += RSDK.Sin256(angle) << 3;
191
192
int32 r = rx * rx + ry * ry;
193
if (r >= 0x10) {
194
if (r < 0x900) {
195
self->velocity.x = (self->startPos.x - self->position.x) >> 4;
196
self->velocity.y = (self->startPos.y - self->position.y) >> 4;
197
}
198
199
self->position.x += self->velocity.x;
200
self->position.y += self->velocity.y;
201
}
202
else {
203
self->position.x = self->startPos.x;
204
self->position.y = self->startPos.y;
205
self->state = PhantomRuby_State_Oscillate;
206
}
207
}
208
#endif
209
210
void PhantomRuby_State_RotateToOrigin(void)
211
{
212
RSDK_THIS(PhantomRuby);
213
214
self->rotation += 6;
215
216
if (self->rotation > 0x200) {
217
self->rotation = 0;
218
self->drawFX = FX_NONE;
219
self->state = StateMachine_None;
220
}
221
}
222
223
#if GAME_INCLUDE_EDITOR
224
void PhantomRuby_EditorDraw(void)
225
{
226
RSDK_THIS(PhantomRuby);
227
PhantomRuby_SetupFlash(self);
228
229
PhantomRuby_Draw();
230
}
231
232
void PhantomRuby_EditorLoad(void)
233
{
234
PhantomRuby->aniFrames = RSDK.LoadSpriteAnimation("Global/PhantomRuby.bin", SCOPE_STAGE);
235
236
RSDK_ACTIVE_VAR(PhantomRuby, sfx);
237
RSDK_ENUM_VAR("None", RUBYSFX_NONE);
238
RSDK_ENUM_VAR("Attack 1", RUBYSFX_ATTACK1);
239
RSDK_ENUM_VAR("Attack 2", RUBYSFX_ATTACK2);
240
RSDK_ENUM_VAR("Attack 3", RUBYSFX_ATTACK3);
241
RSDK_ENUM_VAR("Attack 4", RUBYSFX_ATTACK4);
242
RSDK_ENUM_VAR("Attack 5", RUBYSFX_ATTACK5);
243
RSDK_ENUM_VAR("Attack 6", RUBYSFX_ATTACK6);
244
RSDK_ENUM_VAR("Red Cube", RUBYSFX_REDCUBE);
245
}
246
#endif
247
248
void PhantomRuby_Serialize(void) { RSDK_EDITABLE_VAR(PhantomRuby, VAR_UINT8, sfx); }
249
250