Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/Title/TitleEggman.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: TitleEggman 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
ObjectTitleEggman *TitleEggman;
12
13
void TitleEggman_Update(void)
14
{
15
RSDK_THIS(TitleEggman);
16
17
StateMachine_Run(self->state);
18
}
19
20
void TitleEggman_LateUpdate(void) {}
21
22
void TitleEggman_StaticUpdate(void) {}
23
24
void TitleEggman_Draw(void)
25
{
26
RSDK_THIS(TitleEggman);
27
28
if (self->state == TitleEggman_State_Dust) {
29
RSDK.DrawSprite(&self->smokeAnimator, NULL, false);
30
}
31
else {
32
Vector2 drawPos;
33
self->drawFX = FX_NONE;
34
int32 angle = RSDK.Sin256(2 * self->timer) >> 1;
35
36
for (int32 i = 1; i < 5; ++i) {
37
drawPos.x = (i << 8) * RSDK.Sin1024(angle) + self->position.x;
38
drawPos.y = self->position.y + 0x80000 + (i << 8) * RSDK.Cos1024(angle);
39
RSDK.DrawSprite(&self->chainAnimator, &drawPos, false);
40
}
41
42
self->drawFX = FX_ROTATE;
43
drawPos.x = 0x500 * RSDK.Sin1024(angle) + self->position.x;
44
drawPos.y = 0x500 * RSDK.Cos1024(angle) + self->position.y + 0x80000;
45
self->rotation = -(angle >> 2);
46
RSDK.DrawSprite(&self->capsuleAnimator, &drawPos, false);
47
48
self->drawFX = FX_FLIP;
49
RSDK.DrawSprite(&self->eggmanAnimator, NULL, false);
50
}
51
}
52
53
void TitleEggman_Create(void *data)
54
{
55
RSDK_THIS(TitleEggman);
56
57
if (!SceneInfo->inEditor) {
58
self->visible = true;
59
self->drawGroup = 3;
60
self->active = ACTIVE_NORMAL;
61
62
if (data) {
63
RSDK.SetSpriteAnimation(TitleEggman->aniFrames, 5, &self->smokeAnimator, true, 0);
64
self->state = TitleEggman_State_Dust;
65
}
66
else {
67
RSDK.SetSpriteAnimation(TitleEggman->aniFrames, 2, &self->eggmanAnimator, true, 0);
68
RSDK.SetSpriteAnimation(TitleEggman->aniFrames, 3, &self->chainAnimator, true, 0);
69
RSDK.SetSpriteAnimation(TitleEggman->aniFrames, 4, &self->capsuleAnimator, true, 0);
70
71
self->originPos = self->position;
72
self->velocity.x = 0x10000;
73
self->state = TitleEggman_State_Wait;
74
}
75
}
76
}
77
78
void TitleEggman_StageLoad(void)
79
{
80
if (API.CheckDLC(DLC_PLUS))
81
TitleEggman->aniFrames = RSDK.LoadSpriteAnimation("Title/PlusLogo.bin", SCOPE_STAGE);
82
}
83
84
void TitleEggman_State_Dust(void)
85
{
86
RSDK_THIS(TitleEggman);
87
88
RSDK.ProcessAnimation(&self->smokeAnimator);
89
90
if (self->smokeAnimator.frameID == self->smokeAnimator.frameCount - 1)
91
destroyEntity(self);
92
}
93
void TitleEggman_State_Wait(void)
94
{
95
RSDK_THIS(TitleEggman);
96
97
if (++self->timer == 120) {
98
self->timer = 0;
99
self->state = TitleEggman_State_Move;
100
}
101
}
102
void TitleEggman_State_Move(void)
103
{
104
RSDK_THIS(TitleEggman);
105
106
self->position.x += self->velocity.x;
107
self->originPos.y -= 0x6000;
108
109
self->position.y = self->originPos.y + (RSDK.Sin256(4 * self->timer) << 10);
110
111
++self->timer;
112
if (!(self->timer & 0xF))
113
CREATE_ENTITY(TitleEggman, INT_TO_VOID(true), self->position.x - 0xE0000, self->position.y + 0x80000);
114
115
RSDK.ProcessAnimation(&self->eggmanAnimator);
116
RSDK.ProcessAnimation(&self->capsuleAnimator);
117
}
118
119
#if GAME_INCLUDE_EDITOR
120
void TitleEggman_EditorDraw(void)
121
{
122
RSDK_THIS(TitleEggman);
123
124
RSDK.SetSpriteAnimation(TitleEggman->aniFrames, 2, &self->eggmanAnimator, true, 0);
125
RSDK.SetSpriteAnimation(TitleEggman->aniFrames, 3, &self->chainAnimator, true, 0);
126
RSDK.SetSpriteAnimation(TitleEggman->aniFrames, 4, &self->capsuleAnimator, true, 0);
127
self->originPos = self->position;
128
129
TitleEggman_Draw();
130
}
131
132
void TitleEggman_EditorLoad(void) { TitleEggman->aniFrames = RSDK.LoadSpriteAnimation("Title/PlusLogo.bin", SCOPE_STAGE); }
133
#endif
134
135
void TitleEggman_Serialize(void) {}
136
#endif
137
138