Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/Common/Decoration.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: Decoration Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectDecoration *Decoration;
11
12
void Decoration_Update(void)
13
{
14
RSDK_THIS(Decoration);
15
16
RSDK.ProcessAnimation(&self->animator);
17
18
self->rotation = (self->rotation + self->rotSpeed) & 0x1FF;
19
}
20
21
void Decoration_LateUpdate(void) {}
22
23
void Decoration_StaticUpdate(void) {}
24
25
void Decoration_Draw(void)
26
{
27
RSDK_THIS(Decoration);
28
29
if (self->additive) {
30
RSDK.CopyPalette(0, 160, 1, 160, 16);
31
RSDK.CopyPalette(2, 160, 0, 160, 16);
32
}
33
34
Decoration_DrawSprite();
35
36
if (self->additive)
37
RSDK.CopyPalette(1, 160, 0, 160, 16);
38
}
39
40
void Decoration_Create(void *data)
41
{
42
RSDK_THIS(Decoration);
43
44
self->drawFX = FX_FLIP;
45
if (!SceneInfo->inEditor) {
46
self->active = ACTIVE_BOUNDS;
47
self->visible = true;
48
49
if (self->rotSpeed)
50
self->drawFX |= FX_ROTATE;
51
52
if (RSDK.CheckSceneFolder("TMZ1") || RSDK.CheckSceneFolder("TMZ2"))
53
self->additive = true;
54
55
if (self->additive) {
56
self->inkEffect |= INK_ADD;
57
self->alpha = 0xE0;
58
}
59
60
self->updateRange.x = TO_FIXED(128);
61
self->updateRange.y = TO_FIXED(128);
62
RSDK.SetSpriteAnimation(Decoration->aniFrames, self->type, &self->animator, true, 0);
63
64
if (RSDK.GetFrameID(&self->animator)) // ideally use 'h'
65
self->drawGroup = Zone->objectDrawGroup[1];
66
else
67
self->drawGroup = Zone->objectDrawGroup[0];
68
}
69
}
70
71
void Decoration_StageLoad(void)
72
{
73
if (RSDK.CheckSceneFolder("GHZ"))
74
Decoration->aniFrames = RSDK.LoadSpriteAnimation("GHZ/Decoration.bin", SCOPE_STAGE);
75
else if (RSDK.CheckSceneFolder("CPZ"))
76
Decoration->aniFrames = RSDK.LoadSpriteAnimation("CPZ/Decoration.bin", SCOPE_STAGE);
77
else if (RSDK.CheckSceneFolder("SPZ1"))
78
Decoration->aniFrames = RSDK.LoadSpriteAnimation("SPZ1/Decoration.bin", SCOPE_STAGE);
79
else if (RSDK.CheckSceneFolder("FBZ"))
80
Decoration->aniFrames = RSDK.LoadSpriteAnimation("FBZ/Decoration.bin", SCOPE_STAGE);
81
else if (RSDK.CheckSceneFolder("SSZ1") || RSDK.CheckSceneFolder("SSZ2"))
82
Decoration->aniFrames = RSDK.LoadSpriteAnimation("SSZ/Decoration.bin", SCOPE_STAGE);
83
else if (RSDK.CheckSceneFolder("MMZ1") || RSDK.CheckSceneFolder("MMZ2"))
84
Decoration->aniFrames = RSDK.LoadSpriteAnimation("MMZ/Decoration.bin", SCOPE_STAGE);
85
else if (RSDK.CheckSceneFolder("MSZ"))
86
Decoration->aniFrames = RSDK.LoadSpriteAnimation("MSZ/Decoration.bin", SCOPE_STAGE);
87
#if MANIA_USE_PLUS
88
else if (RSDK.CheckSceneFolder("MSZEnding"))
89
Decoration->aniFrames = RSDK.LoadSpriteAnimation("MSZ/Ending.bin", SCOPE_STAGE);
90
#endif
91
else if (RSDK.CheckSceneFolder("HCZ"))
92
Decoration->aniFrames = RSDK.LoadSpriteAnimation("HCZ/Decoration.bin", SCOPE_STAGE);
93
else if (RSDK.CheckSceneFolder("TMZ1") || RSDK.CheckSceneFolder("TMZ2"))
94
Decoration->aniFrames = RSDK.LoadSpriteAnimation("TMZ1/Decoration.bin", SCOPE_STAGE);
95
else if (RSDK.CheckSceneFolder("TMZ3"))
96
Decoration->aniFrames = RSDK.LoadSpriteAnimation("Phantom/Decoration.bin", SCOPE_STAGE);
97
else if (RSDK.CheckSceneFolder("AIZ"))
98
Decoration->aniFrames = RSDK.LoadSpriteAnimation("AIZ/Decoration.bin", SCOPE_STAGE);
99
}
100
101
void Decoration_DrawSprite(void)
102
{
103
RSDK_THIS(Decoration);
104
105
Vector2 drawPos, repeat;
106
107
repeat.x = FROM_FIXED(self->repeatTimes.x);
108
repeat.y = FROM_FIXED(self->repeatTimes.y);
109
drawPos.x = self->position.x - ((repeat.x * self->repeatSpacing.x) >> 1);
110
drawPos.y = self->position.y - ((repeat.y * self->repeatSpacing.y) >> 1);
111
112
for (int32 y = 0; y <= repeat.y; ++y) {
113
drawPos.x = self->position.x - (repeat.x * self->repeatSpacing.x >> 1);
114
for (int32 x = 0; x <= repeat.x; ++x) {
115
RSDK.DrawSprite(&self->animator, &drawPos, false);
116
drawPos.x += self->repeatSpacing.x;
117
}
118
drawPos.y += self->repeatSpacing.y;
119
}
120
}
121
122
#if GAME_INCLUDE_EDITOR
123
void Decoration_EditorDraw(void)
124
{
125
RSDK_THIS(Decoration);
126
127
RSDK.SetSpriteAnimation(Decoration->aniFrames, self->type, &self->animator, true, 0);
128
129
if (self->rotSpeed)
130
self->drawFX |= FX_ROTATE;
131
else
132
self->drawFX &= ~FX_ROTATE;
133
134
Decoration_DrawSprite();
135
}
136
137
void Decoration_EditorLoad(void)
138
{
139
Decoration_StageLoad();
140
141
RSDK_ACTIVE_VAR(Decoration, direction);
142
RSDK_ENUM_VAR("No Flip", FLIP_NONE);
143
RSDK_ENUM_VAR("Flip X", FLIP_X);
144
RSDK_ENUM_VAR("Flip Y", FLIP_Y);
145
RSDK_ENUM_VAR("Flip XY", FLIP_XY);
146
}
147
#endif
148
149
void Decoration_Serialize(void)
150
{
151
RSDK_EDITABLE_VAR(Decoration, VAR_UINT8, type);
152
RSDK_EDITABLE_VAR(Decoration, VAR_UINT8, direction);
153
RSDK_EDITABLE_VAR(Decoration, VAR_ENUM, rotSpeed);
154
RSDK_EDITABLE_VAR(Decoration, VAR_VECTOR2, repeatTimes);
155
RSDK_EDITABLE_VAR(Decoration, VAR_VECTOR2, repeatSpacing);
156
}
157
158