Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/SSZ/MSPanel.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: MSPanel Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectMSPanel *MSPanel;
11
12
void MSPanel_Update(void)
13
{
14
RSDK_THIS(MSPanel);
15
16
StateMachine_Run(self->state);
17
}
18
19
void MSPanel_LateUpdate(void) {}
20
21
void MSPanel_StaticUpdate(void) {}
22
23
void MSPanel_Draw(void)
24
{
25
RSDK_THIS(MSPanel);
26
27
if (MetalSonic->invincibilityTimerPanel & 1) {
28
RSDK.CopyPalette(2, 32, 0, 32, 16);
29
RSDK.CopyPalette(2, 160, 0, 160, 16);
30
31
RSDK.DrawSprite(&self->cablesAnimator, NULL, false);
32
RSDK.DrawSprite(&self->panelAnimator, NULL, false);
33
34
RSDK.CopyPalette(1, 32, 0, 32, 16);
35
RSDK.CopyPalette(1, 160, 0, 160, 16);
36
}
37
else {
38
RSDK.DrawSprite(&self->cablesAnimator, NULL, false);
39
RSDK.DrawSprite(&self->panelAnimator, NULL, false);
40
}
41
}
42
43
void MSPanel_Create(void *data)
44
{
45
RSDK_THIS(MSPanel);
46
47
if (!SceneInfo->inEditor) {
48
self->active = ACTIVE_BOUNDS;
49
self->visible = true;
50
self->updateRange.x = 0x800000;
51
self->updateRange.y = 0x800000;
52
53
RSDK.SetSpriteAnimation(MSPanel->aniFrames, 1, &self->panelAnimator, true, 0);
54
RSDK.SetSpriteAnimation(MSPanel->aniFrames, 0, &self->cablesAnimator, true, 0);
55
56
self->state = MSPanel_State_SetupPanel;
57
self->drawGroup = Zone->objectDrawGroup[0];
58
}
59
}
60
61
void MSPanel_StageLoad(void) { MSPanel->aniFrames = RSDK.LoadSpriteAnimation("SSZ2/MSPanel.bin", SCOPE_STAGE); }
62
63
void MSPanel_State_SetupPanel(void)
64
{
65
RSDK_THIS(MSPanel);
66
67
EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);
68
69
if (player1->position.x > self->position.x && player1->position.y < self->position.y + 0xE80000) {
70
71
foreach_active(MetalSonic, metal)
72
{
73
if (abs(self->position.x - metal->position.x) < 0x400000 && metal->position.y - self->position.y < 0x1000000) {
74
metal->panel = self;
75
metal->state = MetalSonic_State_EnterPanel;
76
metal->angle = 0;
77
metal->targetPos = self->position;
78
metal->targetPos.y += 0x240000;
79
metal->timer = 0;
80
81
RSDK.SetSpriteAnimation(MetalSonic->aniFrames, 3, &metal->metalSonicAnimator, false, 0);
82
RSDK.SetSpriteAnimation(MetalSonic->aniFrames, 11, &metal->boosterAnimator, false, 0);
83
self->state = StateMachine_None;
84
}
85
}
86
}
87
}
88
89
void MSPanel_State_Active(void)
90
{
91
RSDK_THIS(MSPanel);
92
93
RSDK.ProcessAnimation(&self->panelAnimator);
94
}
95
96
void MSPanel_State_Explode(void)
97
{
98
RSDK_THIS(MSPanel);
99
100
if (!(Zone->timer % 3)) {
101
RSDK.PlaySfx(MetalSonic->sfxExplosion2, false, 255);
102
103
if (!(Zone->timer & 4)) {
104
int32 x = self->position.x + RSDK.Rand(-0x300000, 0x300000);
105
int32 y = self->position.y + RSDK.Rand(-0x100000, 0x400000);
106
107
EntityExplosion *explosion = CREATE_ENTITY(Explosion, INT_TO_VOID((RSDK.Rand(0, 256) > 192) + EXPLOSION_BOSS), x, y);
108
explosion->drawGroup = Zone->objectDrawGroup[1];
109
}
110
}
111
}
112
113
void MSPanel_State_Rumbling(void)
114
{
115
RSDK_THIS(MSPanel);
116
117
if (!(Zone->timer % 3)) {
118
RSDK.PlaySfx(MetalSonic->sfxExplosion2, false, 255);
119
120
if (!(Zone->timer & 4)) {
121
int32 x = self->position.x + RSDK.Rand(-0x600000, 0x600000);
122
int32 y = self->position.y + RSDK.Rand(-0x200000, 0x600000);
123
EntityExplosion *explosion = CREATE_ENTITY(Explosion, INT_TO_VOID((RSDK.Rand(0, 256) > 192) + EXPLOSION_BOSS), x, y);
124
explosion->drawGroup = Zone->objectDrawGroup[1];
125
}
126
}
127
128
if (!(Zone->timer & 0xF)) {
129
Camera_ShakeScreen(0, 0, 4);
130
RSDK.PlaySfx(MetalSonic->sfxRumble, false, 255);
131
}
132
}
133
134
#if GAME_INCLUDE_EDITOR
135
void MSPanel_EditorDraw(void)
136
{
137
RSDK_THIS(MSPanel);
138
139
RSDK.SetSpriteAnimation(MSPanel->aniFrames, 1, &self->panelAnimator, false, 0);
140
RSDK.SetSpriteAnimation(MSPanel->aniFrames, 0, &self->cablesAnimator, false, 0);
141
142
RSDK.DrawSprite(&self->cablesAnimator, NULL, false);
143
RSDK.DrawSprite(&self->panelAnimator, NULL, false);
144
}
145
146
void MSPanel_EditorLoad(void) { MSPanel->aniFrames = RSDK.LoadSpriteAnimation("SSZ2/MSPanel.bin", SCOPE_STAGE); }
147
#endif
148
149
void MSPanel_Serialize(void) {}
150
151