Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/SSZ/MSHologram.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: MSHologram Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectMSHologram *MSHologram;
11
12
void MSHologram_Update(void)
13
{
14
RSDK_THIS(MSHologram);
15
16
self->angle = (self->angle + 4) & 0xFF;
17
18
RSDK.ProcessAnimation(&self->lightsAnimator);
19
RSDK.ProcessAnimation(&self->metalSonicAnimator);
20
RSDK.ProcessAnimation(&self->rabbitAnimator);
21
RSDK.ProcessAnimation(&self->canaryAnimator);
22
23
StateMachine_Run(self->state);
24
}
25
26
void MSHologram_LateUpdate(void) {}
27
28
void MSHologram_StaticUpdate(void) {}
29
30
void MSHologram_Draw(void)
31
{
32
RSDK_THIS(MSHologram);
33
Vector2 drawPos;
34
35
drawPos.x = self->position.x;
36
drawPos.y = self->position.y;
37
RSDK.DrawSprite(&self->projectorAnimator, NULL, false);
38
39
if (!(Zone->timer & 2)) {
40
RSDK.DrawSprite(&self->lightsAnimator, NULL, false);
41
42
self->direction = FLIP_X;
43
RSDK.DrawSprite(&self->rabbitAnimator, NULL, false);
44
45
self->direction = FLIP_NONE;
46
RSDK.DrawSprite(&self->metalSonicAnimator, NULL, false);
47
48
if (self->angle < 0x80)
49
self->direction = FLIP_X;
50
51
drawPos.x += (RSDK.Cos256(self->angle) - 0x140) << 13;
52
drawPos.y += (RSDK.Sin256(self->angle) - 0x1C0) << 12;
53
RSDK.DrawSprite(&self->canaryAnimator, &drawPos, false);
54
55
self->direction = FLIP_NONE;
56
}
57
}
58
59
void MSHologram_Create(void *data)
60
{
61
RSDK_THIS(MSHologram);
62
63
if (!SceneInfo->inEditor) {
64
if (globals->gameMode == MODE_TIMEATTACK) {
65
destroyEntity(self);
66
}
67
else {
68
self->active = ACTIVE_BOUNDS;
69
self->visible = true;
70
self->drawFX = FX_FLIP;
71
self->drawGroup = Zone->objectDrawGroup[0];
72
self->updateRange.x = 0x800000;
73
self->updateRange.y = 0x800000;
74
75
RSDK.SetSpriteAnimation(MSHologram->aniFrames, 0, &self->projectorAnimator, true, 0);
76
RSDK.SetSpriteAnimation(MSHologram->aniFrames, 1, &self->lightsAnimator, true, 0);
77
RSDK.SetSpriteAnimation(MSHologram->aniFrames, 2, &self->metalSonicAnimator, true, 0);
78
RSDK.SetSpriteAnimation(MSHologram->aniFrames, 3, &self->rabbitAnimator, true, 0);
79
RSDK.SetSpriteAnimation(MSHologram->aniFrames, 4, &self->canaryAnimator, true, 0);
80
81
self->state = MSHologram_State_CheckPlayerCollisions;
82
}
83
}
84
}
85
86
void MSHologram_StageLoad(void)
87
{
88
if (RSDK.CheckSceneFolder("SSZ1"))
89
MSHologram->aniFrames = RSDK.LoadSpriteAnimation("SSZ1/MSHologram.bin", SCOPE_STAGE);
90
else if (RSDK.CheckSceneFolder("SSZ2"))
91
MSHologram->aniFrames = RSDK.LoadSpriteAnimation("SSZ2/MSHologram.bin", SCOPE_STAGE);
92
93
MSHologram->hitbox.left = -12;
94
MSHologram->hitbox.top = -10;
95
MSHologram->hitbox.right = 12;
96
MSHologram->hitbox.bottom = 10;
97
98
MSHologram->sfxExplosion = RSDK.GetSfx("Stage/Explosion2.wav");
99
}
100
101
void MSHologram_State_CheckPlayerCollisions(void)
102
{
103
RSDK_THIS(MSHologram);
104
105
foreach_active(Player, player)
106
{
107
if (player->animator.animationID == ANI_JUMP || player->animator.animationID == ANI_DROPDASH) {
108
if (Player_CheckBadnikTouch(player, self, &MSHologram->hitbox))
109
self->state = MSHologram_State_Explode;
110
}
111
else {
112
Player_CheckCollisionBox(player, self, &MSHologram->hitbox);
113
}
114
}
115
}
116
117
void MSHologram_State_Explode(void)
118
{
119
RSDK_THIS(MSHologram);
120
121
if (!(Zone->timer % 3)) {
122
RSDK.PlaySfx(MSHologram->sfxExplosion, false, 255);
123
124
if (Zone->timer & 4) {
125
int32 x = RSDK.Rand(-8, 8) << 16;
126
int32 y = RSDK.Rand(-8, 8) << 16;
127
EntityExplosion *explosion = CREATE_ENTITY(Explosion, INT_TO_VOID(EXPLOSION_ENEMY), x + self->position.x, y + self->position.y);
128
explosion->drawGroup = Zone->objectDrawGroup[1];
129
}
130
}
131
132
if (++self->timer == 80) {
133
self->timer = 0;
134
self->destroyed = true;
135
self->visible = false;
136
self->state = MSHologram_State_Destroyed;
137
138
for (int32 i = 0; i < 16; ++i) {
139
int32 x = self->position.x + RSDK.Rand(0x800000, 0xE00000);
140
int32 y = self->position.y - RSDK.Rand(0x200000, 0x800000);
141
EntityAnimals *animal = CREATE_ENTITY(Animals, INT_TO_VOID(RSDK.Rand(1, 12)), x, y);
142
animal->updateRange.x = 0x1000000;
143
animal->updateRange.y = 0x1000000;
144
animal->behaviour = ANIMAL_BEHAVE_FOLLOW;
145
}
146
}
147
}
148
149
void MSHologram_State_Destroyed(void)
150
{
151
RSDK_THIS(MSHologram);
152
153
if (++self->timer == 384) {
154
foreach_active(Animals, animal)
155
{
156
if (animal->behaviour == ANIMAL_BEHAVE_FOLLOW)
157
animal->behaviour = ANIMAL_BEHAVE_FREE;
158
}
159
160
destroyEntity(self);
161
}
162
}
163
164
#if GAME_INCLUDE_EDITOR
165
void MSHologram_EditorDraw(void)
166
{
167
RSDK_THIS(MSHologram);
168
169
RSDK.SetSpriteAnimation(MSHologram->aniFrames, 0, &self->projectorAnimator, false, 0);
170
RSDK.SetSpriteAnimation(MSHologram->aniFrames, 1, &self->lightsAnimator, false, 0);
171
RSDK.SetSpriteAnimation(MSHologram->aniFrames, 2, &self->metalSonicAnimator, false, 0);
172
RSDK.SetSpriteAnimation(MSHologram->aniFrames, 3, &self->rabbitAnimator, false, 0);
173
RSDK.SetSpriteAnimation(MSHologram->aniFrames, 4, &self->canaryAnimator, false, 0);
174
175
Vector2 drawPos;
176
drawPos.x = self->position.x;
177
drawPos.y = self->position.y;
178
RSDK.DrawSprite(&self->projectorAnimator, NULL, false);
179
180
RSDK.DrawSprite(&self->lightsAnimator, NULL, false);
181
182
self->direction = FLIP_X;
183
RSDK.DrawSprite(&self->rabbitAnimator, NULL, false);
184
185
self->direction = FLIP_NONE;
186
RSDK.DrawSprite(&self->metalSonicAnimator, NULL, false);
187
188
if (self->angle < 128)
189
self->direction = FLIP_X;
190
drawPos.x += (RSDK.Cos256(self->angle) - 0x140) << 13;
191
drawPos.y += (RSDK.Sin256(self->angle) - 0x1C0) << 12;
192
RSDK.DrawSprite(&self->canaryAnimator, &drawPos, false);
193
194
self->direction = FLIP_NONE;
195
}
196
197
void MSHologram_EditorLoad(void)
198
{
199
if (RSDK.CheckSceneFolder("SSZ1"))
200
MSHologram->aniFrames = RSDK.LoadSpriteAnimation("SSZ1/MSHologram.bin", SCOPE_STAGE);
201
else if (RSDK.CheckSceneFolder("SSZ2"))
202
MSHologram->aniFrames = RSDK.LoadSpriteAnimation("SSZ2/MSHologram.bin", SCOPE_STAGE);
203
}
204
#endif
205
206
void MSHologram_Serialize(void) {}
207
208