Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/Title/TitleBG.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: TitleBG Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectTitleBG *TitleBG;
11
12
void TitleBG_Update(void)
13
{
14
RSDK_THIS(TitleBG);
15
16
if (self->type == TITLEBG_WINGSHINE) {
17
self->position.y += 0x10000;
18
19
++self->timer;
20
if (self->timer == 32) {
21
self->timer = 0;
22
self->position.y -= 0x200000;
23
}
24
}
25
else {
26
self->position.x -= 0x10000;
27
if (self->position.x < -0x800000)
28
self->position.x += 0x3000000;
29
}
30
}
31
32
void TitleBG_LateUpdate(void) {}
33
34
void TitleBG_StaticUpdate(void)
35
{
36
TitleBG->timer += 0x8000;
37
TitleBG->timer &= 0x7FFFFFFF;
38
39
++TitleBG->angle;
40
TitleBG->angle &= 0x3FF;
41
42
if (++TitleBG->palTimer == 6) {
43
TitleBG->palTimer = 0;
44
RSDK.RotatePalette(0, 140, 143, false);
45
}
46
}
47
48
void TitleBG_Draw(void)
49
{
50
RSDK_THIS(TitleBG);
51
52
RSDK.SetClipBounds(0, 0, 0, ScreenInfo->size.x, ScreenInfo->size.y);
53
RSDK.DrawSprite(&self->animator, NULL, false);
54
}
55
56
void TitleBG_Create(void *data)
57
{
58
RSDK_THIS(TitleBG);
59
60
if (!SceneInfo->inEditor) {
61
RSDK.SetSpriteAnimation(TitleBG->aniFrames, self->type, &self->animator, true, 0);
62
63
self->active = ACTIVE_NORMAL;
64
self->visible = false;
65
self->drawGroup = 1;
66
self->alpha = 0xFF;
67
self->drawFX = FX_FLIP;
68
69
switch (self->type) {
70
case TITLEBG_MOUNTAIN2: self->inkEffect = INK_BLEND; break;
71
72
case TITLEBG_REFLECTION:
73
case TITLEBG_WATERSPARKLE:
74
self->inkEffect = INK_ADD;
75
self->alpha = 0x80;
76
break;
77
78
case TITLEBG_WINGSHINE:
79
self->drawGroup = 4;
80
self->inkEffect = INK_MASKED;
81
break;
82
default: break;
83
}
84
}
85
}
86
87
void TitleBG_StageLoad(void)
88
{
89
TitleBG->aniFrames = RSDK.LoadSpriteAnimation("Title/Background.bin", SCOPE_STAGE);
90
91
RSDK.SetPaletteEntry(0, 55, 0x202030);
92
}
93
94
void TitleBG_SetupFX(void)
95
{
96
RSDK.GetTileLayer(0)->drawGroup[0] = DRAWGROUP_COUNT;
97
RSDK.GetTileLayer(1)->drawGroup[0] = 0;
98
99
TileLayer *cloudLayer = RSDK.GetTileLayer(2);
100
cloudLayer->drawGroup[0] = 0;
101
cloudLayer->scanlineCallback = TitleBG_Scanline_Clouds;
102
103
TileLayer *islandLayer = RSDK.GetTileLayer(3);
104
islandLayer->drawGroup[0] = 1;
105
islandLayer->scanlineCallback = TitleBG_Scanline_Island;
106
107
foreach_all(TitleBG, titleBG) { titleBG->visible = true; }
108
foreach_all(Title3DSprite, title3DSprite) { title3DSprite->visible = true; }
109
110
RSDK.SetPaletteEntry(0, 55, 0x00FF00);
111
RSDK.SetPaletteMask(0x00FF00);
112
RSDK.SetDrawGroupProperties(2, true, StateMachine_None);
113
}
114
115
void TitleBG_Scanline_Clouds(ScanlineInfo *scanlines)
116
{
117
RSDK.SetClipBounds(0, 0, 0, ScreenInfo->size.x, SCREEN_YSIZE / 2);
118
119
int32 sine = RSDK.Sin256(0);
120
int32 cosine = RSDK.Cos256(0);
121
122
int32 off = 0x1000000;
123
for (int32 i = 0xA0; i > 0x20; --i) {
124
int32 id = off / (8 * i);
125
int32 sin = sine * id;
126
int32 cos = cosine * id;
127
128
scanlines->deform.x = (-cos >> 7);
129
scanlines->deform.y = sin >> 7;
130
scanlines->position.x = sin - ScreenInfo->center.x * (-cos >> 7);
131
scanlines->position.y = TitleBG->timer + 2 * cos - ScreenInfo->center.x * (sin >> 7);
132
133
off -= 0x4000;
134
scanlines++;
135
}
136
}
137
138
void TitleBG_Scanline_Island(ScanlineInfo *scanlines)
139
{
140
RSDK.SetClipBounds(0, 0, 168, ScreenInfo->size.x, SCREEN_YSIZE);
141
142
int32 sine = RSDK.Sin1024(-TitleBG->angle) >> 2;
143
int32 cosine = RSDK.Cos1024(-TitleBG->angle) >> 2;
144
145
ScanlineInfo *scanlinePtr = &scanlines[168];
146
for (int32 i = 16; i < 88; ++i) {
147
int32 id = 0xA00000 / (8 * i);
148
int32 sin = sine * id;
149
int32 cos = cosine * id;
150
151
scanlinePtr->deform.y = sin >> 7;
152
scanlinePtr->deform.x = -cos >> 7;
153
scanlinePtr->position.y = cos - ScreenInfo->center.x * scanlinePtr->deform.y - 0xA000 * cosine + 0x2000000;
154
scanlinePtr->position.x = sin - ScreenInfo->center.x * scanlinePtr->deform.x - 0xA000 * sine + 0x2000000;
155
++scanlinePtr;
156
}
157
}
158
159
#if GAME_INCLUDE_EDITOR
160
void TitleBG_EditorDraw(void)
161
{
162
RSDK_THIS(TitleBG);
163
164
RSDK.SetSpriteAnimation(TitleBG->aniFrames, self->type, &self->animator, true, 0);
165
self->alpha = 0xFF;
166
self->drawFX = FX_FLIP;
167
self->inkEffect = INK_NONE;
168
169
switch (self->type) {
170
case TITLEBG_MOUNTAIN2: self->inkEffect = INK_BLEND; break;
171
172
case TITLEBG_REFLECTION:
173
case TITLEBG_WATERSPARKLE:
174
self->inkEffect = INK_ADD;
175
self->alpha = 0x80;
176
break;
177
178
case TITLEBG_WINGSHINE:
179
self->drawGroup = 4;
180
self->inkEffect = INK_MASKED;
181
break;
182
183
default: break;
184
}
185
186
RSDK.DrawSprite(&self->animator, NULL, false);
187
}
188
189
void TitleBG_EditorLoad(void)
190
{
191
TitleBG->aniFrames = RSDK.LoadSpriteAnimation("Title/Background.bin", SCOPE_STAGE);
192
193
RSDK_ACTIVE_VAR(TitleBG, type);
194
RSDK_ENUM_VAR("Mountain Top 1", TITLEBG_MOUNTAIN1);
195
RSDK_ENUM_VAR("Mountain Top 2", TITLEBG_MOUNTAIN2);
196
RSDK_ENUM_VAR("Reflection", TITLEBG_REFLECTION);
197
RSDK_ENUM_VAR("Water Sparkle", TITLEBG_WATERSPARKLE);
198
RSDK_ENUM_VAR("Wing Shine", TITLEBG_WINGSHINE);
199
}
200
#endif
201
202
void TitleBG_Serialize(void) { RSDK_EDITABLE_VAR(TitleBG, VAR_ENUM, type); }
203
204