Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/Global/InvincibleStars.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: InvincibleStars Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectInvincibleStars *InvincibleStars;
11
12
void InvincibleStars_Update(void)
13
{
14
RSDK_THIS(InvincibleStars);
15
16
EntityPlayer *player = self->player;
17
if (player) {
18
self->starFrame[0] = (self->starAngle[0] + 1) % 12;
19
self->starFrame[1] = (self->starAngle[1] + 1) % 10;
20
21
for (int32 i = 8 - 1; i > 0; --i) {
22
self->starPos[i].x = self->starPos[i - 1].x;
23
self->starPos[i].y = self->starPos[i - 1].y;
24
}
25
self->starPos[0].x = player->position.x;
26
self->starPos[0].y = player->position.y;
27
28
Hitbox *playerHitbox = Player_GetHitbox(player);
29
if (player->direction & FLIP_X)
30
self->starPos[0].x += (playerHitbox->left << 15) - (playerHitbox->right << 15) - (playerHitbox->left << 16);
31
else
32
self->starPos[0].x += ((playerHitbox->right + 2 * playerHitbox->left) << 15) - (playerHitbox->left << 15);
33
34
if ((player->direction & FLIP_Y) && !player->invertGravity)
35
self->starPos[0].y += (playerHitbox->top << 15) - (playerHitbox->bottom << 15) - (playerHitbox->top << 16);
36
else
37
self->starPos[0].y += ((playerHitbox->bottom + 2 * playerHitbox->top) << 15) - (playerHitbox->top << 15);
38
39
if (player->direction) {
40
self->starAngle[0] -= 144;
41
self->starAngle[1] -= 16;
42
}
43
else {
44
self->starAngle[0] += 144;
45
self->starAngle[1] += 16;
46
}
47
48
self->starAngle[0] &= 0x1FF;
49
self->starAngle[1] &= 0x1FF;
50
51
if (player->invincibleTimer < 32)
52
self->alpha = 8 * player->invincibleTimer;
53
54
self->drawGroup = player->drawGroup;
55
self->visible = player->visible || (player->state == Ice_PlayerState_Frozen);
56
self->starOffset = 11;
57
}
58
else {
59
destroyEntity(self);
60
}
61
}
62
63
void InvincibleStars_LateUpdate(void) {}
64
65
void InvincibleStars_StaticUpdate(void) {}
66
67
void InvincibleStars_Draw(void)
68
{
69
RSDK_THIS(InvincibleStars);
70
71
EntityPlayer *player = self->player;
72
if (player) {
73
if (player->isChibi) {
74
self->drawFX |= FX_SCALE;
75
self->scale.x = 0x100;
76
self->scale.y = 0x100;
77
}
78
else {
79
if (player->drawFX & FX_SCALE)
80
self->drawFX |= FX_SCALE;
81
else
82
self->drawFX &= ~FX_SCALE;
83
self->scale.x = player->scale.x;
84
self->scale.y = player->scale.y;
85
}
86
}
87
88
Vector2 drawPos;
89
drawPos.x = (RSDK.Cos512(self->starAngle[1] + 0x74) << self->starOffset) + self->starPos[7].x;
90
drawPos.y = (RSDK.Sin512(self->starAngle[1] + 0x74) << self->starOffset) + self->starPos[7].y;
91
self->starAnimator[3].frameID = self->starFrame[0];
92
RSDK.DrawSprite(&self->starAnimator[3], &drawPos, false);
93
94
drawPos.x = (RSDK.Cos512(self->starAngle[1] + 0x174) << self->starOffset) + self->starPos[7].x;
95
drawPos.y = (RSDK.Sin512(self->starAngle[1] + 0x174) << self->starOffset) + self->starPos[7].y;
96
self->starAnimator[3].frameID += 6;
97
RSDK.DrawSprite(&self->starAnimator[3], &drawPos, false);
98
99
drawPos.x = (RSDK.Cos512(self->starAngle[1]) << self->starOffset) + self->starPos[5].x;
100
drawPos.y = (RSDK.Sin512(self->starAngle[1]) << self->starOffset) + self->starPos[5].y;
101
self->starAnimator[2].frameID = self->starFrame[0];
102
RSDK.DrawSprite(&self->starAnimator[2], &drawPos, false);
103
104
drawPos.x = (RSDK.Cos512(self->starAngle[1] + 0x100) << self->starOffset) + self->starPos[5].x;
105
drawPos.y = (RSDK.Sin512(self->starAngle[1] + 0x100) << self->starOffset) + self->starPos[5].y;
106
self->starAnimator[2].frameID += 6;
107
RSDK.DrawSprite(&self->starAnimator[2], &drawPos, false);
108
109
drawPos.x = (RSDK.Cos512(self->starAngle[1] + 0xA8) << self->starOffset) + self->starPos[3].x;
110
drawPos.y = (RSDK.Sin512(self->starAngle[1] + 0xA8) << self->starOffset) + self->starPos[3].y;
111
self->starAnimator[1].frameID = self->starFrame[1];
112
RSDK.DrawSprite(&self->starAnimator[1], &drawPos, false);
113
114
drawPos.x = (RSDK.Cos512(self->starAngle[1] + 0x1A8) << self->starOffset) + self->starPos[3].x;
115
drawPos.y = (RSDK.Sin512(self->starAngle[1] + 0x1A8) << self->starOffset) + self->starPos[3].y;
116
self->starAnimator[1].frameID += 5;
117
RSDK.DrawSprite(&self->starAnimator[1], &drawPos, false);
118
119
drawPos.x = (RSDK.Cos512(self->starAngle[0]) << self->starOffset) + self->starPos[0].x;
120
drawPos.y = (RSDK.Sin512(self->starAngle[0]) << self->starOffset) + self->starPos[0].y;
121
self->starAnimator[0].frameID = self->starFrame[0];
122
RSDK.DrawSprite(&self->starAnimator[0], &drawPos, false);
123
124
drawPos.x = (RSDK.Cos512(self->starAngle[0] + 0x100) << self->starOffset) + self->starPos[0].x;
125
drawPos.y = (RSDK.Sin512(self->starAngle[0] + 0x100) << self->starOffset) + self->starPos[0].y;
126
RSDK.DrawSprite(&self->starAnimator[0], &drawPos, false);
127
}
128
129
void InvincibleStars_Create(void *data)
130
{
131
RSDK_THIS(InvincibleStars);
132
133
if (!SceneInfo->inEditor) {
134
self->active = ACTIVE_NORMAL;
135
self->visible = true;
136
self->player = (EntityPlayer *)data;
137
for (int32 i = 0; i < 8; ++i) {
138
self->starPos[i].x = self->player->position.x;
139
self->starPos[i].y = self->player->position.y;
140
}
141
142
self->drawFX = FX_FLIP;
143
self->inkEffect = INK_ADD;
144
self->starAngle[0] = 180;
145
self->starAngle[1] = 0;
146
self->alpha = 0xFF;
147
RSDK.SetSpriteAnimation(InvincibleStars->aniFrames, 0, &self->starAnimator[0], true, 0);
148
RSDK.SetSpriteAnimation(InvincibleStars->aniFrames, 1, &self->starAnimator[1], true, 0);
149
RSDK.SetSpriteAnimation(InvincibleStars->aniFrames, 2, &self->starAnimator[2], true, 0);
150
RSDK.SetSpriteAnimation(InvincibleStars->aniFrames, 3, &self->starAnimator[3], true, 0);
151
}
152
}
153
154
void InvincibleStars_StageLoad(void) { InvincibleStars->aniFrames = RSDK.LoadSpriteAnimation("Global/Invincible.bin", SCOPE_STAGE); }
155
156
#if GAME_INCLUDE_EDITOR
157
void InvincibleStars_EditorDraw(void) {}
158
159
void InvincibleStars_EditorLoad(void) {}
160
#endif
161
162
void InvincibleStars_Serialize(void) {}
163
164