Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/TMZ/TMZ1Setup.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: TMZ1Setup Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectTMZ1Setup *TMZ1Setup;
11
12
void TMZ1Setup_Update(void)
13
{
14
RSDK_THIS(TMZ1Setup);
15
16
StateMachine_Run(self->state);
17
}
18
19
void TMZ1Setup_LateUpdate(void) {}
20
21
void TMZ1Setup_StaticUpdate(void)
22
{
23
if (!(Zone->timer & 1))
24
++TMZ1Setup->background1->deformationOffset;
25
26
if (!(Zone->timer & 3)) {
27
TMZ1Setup->bannerAniFrame += 32;
28
TMZ1Setup->bannerAniFrame = TMZ1Setup->bannerAniFrame & 0xFF;
29
RSDK.DrawAniTiles(TMZ1Setup->aniTiles, 34, TMZ1Setup->bannerAniFrame, 0, 32, 112);
30
}
31
32
if (!(Zone->timer & 1))
33
RSDK.RotatePalette(0, 204, 207, false);
34
35
if (!RSDK.GetEntityCount(TMZ1Setup->classID, true)) {
36
RSDK.SetLimitedFade(0, 1, 2, (RSDK.Sin256(2 * Zone->timer) >> 1) + 0x80, 192, 197);
37
RSDK.SetLimitedFade(0, 1, 2, (RSDK.Sin256(2 * Zone->timer + 0x80) >> 1) + 0x80, 198, 203);
38
RSDK.SetLimitedFade(0, 1, 2, (RSDK.Sin256(4 * Zone->timer + 0x80) >> 1) + 0x40, 220, 223);
39
RSDK.SetLimitedFade(0, 1, 2, (RSDK.Sin256(Zone->timer) >> 1) + 0x80, 211, 213);
40
RSDK.SetLimitedFade(0, 1, 2, (RSDK.Sin256(Zone->timer + 0x80) >> 1) + 0x80, 237, 239);
41
}
42
43
if (TMZ1Setup->aniTileDuration <= 0) {
44
TMZ1Setup->angle += 32;
45
TMZ1Setup->angle &= 0xFF;
46
47
RSDK.SetLimitedFade(0, 1, 2, (RSDK.Sin256(TMZ1Setup->angle) >> 1) + 0x80, 184, 190);
48
49
if (TMZ1Setup->angle == 160) {
50
TMZ1Setup->aniTileDuration = RSDK.Rand(2, 60);
51
}
52
}
53
else {
54
TMZ1Setup->aniTileDuration--;
55
}
56
57
if (TMZ1Setup->stageState < TMZ1_STAGESTATE_LIFT) {
58
int32 posY = ScreenInfo->center.y + ScreenInfo->position.y;
59
60
// Dunno what the data param is for here, it goes unused, maybe an earlier version of what "stageState" does?
61
if (posY > 4528 && TMZ1Setup->stageState != TMZ1_STAGESTATE_CITY && !RSDK.GetEntityCount(TMZ1Setup->classID, true)) {
62
CREATE_ENTITY(TMZ1Setup, INT_TO_VOID(1), 0, 0);
63
}
64
else if (posY < 4192 && TMZ1Setup->stageState != TMZ1_STAGESTATE_SKY && !RSDK.GetEntityCount(TMZ1Setup->classID, true)) {
65
CREATE_ENTITY(TMZ1Setup, INT_TO_VOID(0), 0, 0);
66
}
67
}
68
69
EntityActClear *actClear = RSDK_GET_ENTITY(SLOT_ACTCLEAR, ActClear);
70
if (!TMZ1Setup->hasAchievement && actClear->classID == ActClear->classID && actClear->state == ActClear_State_EnterText && !Player->gotHit[0]) {
71
API_UnlockAchievement(&achievementList[ACH_TMZ]);
72
TMZ1Setup->hasAchievement = true;
73
}
74
}
75
76
void TMZ1Setup_Draw(void) {}
77
78
void TMZ1Setup_Create(void *data)
79
{
80
RSDK_THIS(TMZ1Setup);
81
self->active = ACTIVE_NORMAL;
82
83
switch (TMZ1Setup->stageState) {
84
default: self->state = TMZ1Setup_State_FadeOutCurrentBG; break;
85
case TMZ1_STAGESTATE_NONE: self->state = TMZ1Setup_State_ShowOutsideBGs; break;
86
case TMZ1_STAGESTATE_LIFT: self->state = TMZ1Setup_State_FadeToLift; break;
87
}
88
}
89
90
void TMZ1Setup_StageLoad(void)
91
{
92
TMZ1Setup->aniTiles = RSDK.LoadSpriteSheet("TMZ1/AniTiles.gif", SCOPE_STAGE);
93
TMZ1Setup->aniTileDuration = RSDK.Rand(2, 60);
94
95
TMZ1Setup->angle = 0xC0;
96
TMZ1Setup->stageState = TMZ1_STAGESTATE_NONE;
97
98
TMZ1Setup->background1 = RSDK.GetTileLayer(0);
99
int32 ang = 0;
100
for (int32 i = 0; i < 0x200; ++i) {
101
TMZ1Setup->background1->deformationData[i] = (4 * RSDK.Sin1024(ang)) >> 10;
102
ang += 0x10;
103
}
104
memcpy(&TMZ1Setup->background1->deformationData[0x200], &TMZ1Setup->background1->deformationData[0], 0x200 * sizeof(int32));
105
106
RSDK.GetTileLayer(2)->scrollPos = -(256 << 16);
107
RSDK.GetTileLayer(3)->scrollPos = -(256 << 16);
108
109
if (!TMZ1Setup->paletteInit) {
110
#if MANIA_USE_PLUS
111
if (SceneInfo->filter & FILTER_ENCORE) {
112
RSDK.LoadPalette(0, "EncoreTMZ1.act", 0b0000000011111111);
113
RSDK.LoadPalette(1, "EncoreTMZ1d.act", 0b0000000011111111);
114
RSDK.LoadPalette(2, "EncoreTMZ1l.act", 0b0000000011111111);
115
}
116
#endif
117
118
for (int32 i = 0; i < 256; ++i) RSDK.SetPaletteEntry(5, i, 0x000000);
119
RSDK.CopyPalette(0, 0, 4, 0, 255);
120
121
TMZ1Setup->paletteInit = true;
122
}
123
124
RSDK.SetLimitedFade(3, 3, 4, 128, 0, 256);
125
RSDK.SetLimitedFade(6, 0, 5, 192, 0, 256);
126
127
Animals->animalTypes[0] = ANIMAL_TOCKY;
128
Animals->animalTypes[1] = ANIMAL_PICKY;
129
130
// BGSwitch is used for Sky <-> Lift BGs, this object manages the city & sky BG changes itself
131
BGSwitch->switchCallback[TMZ1_BG_CITY] = TMZ1Setup_BGSwitch_ShowSky;
132
BGSwitch->switchCallback[TMZ1_BG_LIFT] = TMZ1Setup_BGSwitch_ShowLift;
133
134
RSDK.SetDrawGroupProperties(Zone->hudDrawGroup - 1, false, StateMachine_None);
135
RSDK.SetDrawGroupProperties(Zone->hudDrawGroup, false, StateMachine_None);
136
137
if (isMainGameMode() && CutsceneRules_IsAct1())
138
Zone->stageFinishCallback = TMZ1Setup_StageFinish_EndAct1;
139
140
if (CutsceneRules_CheckStageReload())
141
TMZ1Setup->hasAchievement = true;
142
}
143
144
void TMZ1Setup_BGSwitch_ShowSky(void)
145
{
146
RSDK.GetTileLayer(0)->drawGroup[BGSwitch->screenID] = 0;
147
RSDK.GetTileLayer(1)->drawGroup[BGSwitch->screenID] = 0;
148
RSDK.GetTileLayer(2)->drawGroup[BGSwitch->screenID] = DRAWGROUP_COUNT;
149
RSDK.GetTileLayer(3)->drawGroup[BGSwitch->screenID] = DRAWGROUP_COUNT;
150
RSDK.GetTileLayer(4)->drawGroup[BGSwitch->screenID] = DRAWGROUP_COUNT;
151
152
foreach_active(MonarchBG, monarch) { monarch->visible = true; }
153
154
TMZ1Setup->stageState = TMZ1_STAGESTATE_SKY;
155
}
156
157
void TMZ1Setup_BGSwitch_ShowLift(void)
158
{
159
RSDK.GetTileLayer(0)->drawGroup[BGSwitch->screenID] = DRAWGROUP_COUNT;
160
RSDK.GetTileLayer(1)->drawGroup[BGSwitch->screenID] = DRAWGROUP_COUNT;
161
RSDK.GetTileLayer(2)->drawGroup[BGSwitch->screenID] = DRAWGROUP_COUNT;
162
RSDK.GetTileLayer(3)->drawGroup[BGSwitch->screenID] = DRAWGROUP_COUNT;
163
RSDK.GetTileLayer(4)->drawGroup[BGSwitch->screenID] = 0;
164
165
foreach_active(MonarchBG, monarch) { monarch->visible = false; }
166
167
TMZ1Setup->stageState = TMZ1_STAGESTATE_LIFT;
168
}
169
170
void TMZ1Setup_StageFinish_EndAct1(void)
171
{
172
foreach_active(CrimsonEye, crimsonEye)
173
{
174
if (crimsonEye->state == CrimsonEye_StateContainer_HandleElevator) {
175
crimsonEye->state = CrimsonEye_StateContainer_Explode;
176
CREATE_ENTITY(TMZ1Outro, NULL, crimsonEye->position.x, crimsonEye->position.y);
177
}
178
}
179
}
180
181
void TMZ1Setup_State_FadeToLift(void)
182
{
183
RSDK_THIS(TMZ1Setup);
184
185
if (self->timer < 256) {
186
self->timer += 8;
187
RSDK.SetLimitedFade(0, 4, 3, self->timer, 128, 207);
188
}
189
else {
190
destroyEntity(self);
191
}
192
}
193
194
void TMZ1Setup_State_ShowOutsideBGs(void)
195
{
196
RSDK_THIS(TMZ1Setup);
197
198
if (++self->timer >= 2) {
199
if (ScreenInfo->position.y + ScreenInfo->center.y > 4192)
200
self->state = TMZ1Setup_State_ShowCityBG;
201
else
202
self->state = TMZ1Setup_State_ShowSkyBG;
203
}
204
}
205
206
void TMZ1Setup_State_FadeOutCurrentBG(void)
207
{
208
RSDK_THIS(TMZ1Setup);
209
210
if (self->timer >= 256) {
211
if (TMZ1Setup->stageState) {
212
TMZ1Setup->stageState = TMZ1_STAGESTATE_SKY;
213
214
RSDK.GetTileLayer(0)->drawGroup[0] = 0;
215
RSDK.GetTileLayer(1)->drawGroup[0] = 0;
216
RSDK.GetTileLayer(2)->drawGroup[0] = DRAWGROUP_COUNT;
217
RSDK.GetTileLayer(3)->drawGroup[0] = DRAWGROUP_COUNT;
218
}
219
else {
220
TMZ1Setup->stageState = TMZ1_STAGESTATE_CITY;
221
222
RSDK.GetTileLayer(0)->drawGroup[0] = DRAWGROUP_COUNT;
223
RSDK.GetTileLayer(1)->drawGroup[0] = DRAWGROUP_COUNT;
224
RSDK.GetTileLayer(2)->drawGroup[0] = 0;
225
RSDK.GetTileLayer(3)->drawGroup[0] = 0;
226
}
227
228
self->state = TMZ1Setup_State_FadeIntoOutsideBGs;
229
}
230
else {
231
self->timer += 8;
232
233
if (TMZ1Setup->stageState)
234
RSDK.SetLimitedFade(0, 3, 4, self->timer >> 1, 128, 207);
235
else
236
RSDK.SetLimitedFade(0, 4, 3, self->timer >> 1, 128, 207);
237
238
RSDK.SetLimitedFade(0, 4, 5, self->timer, 208, 256);
239
}
240
}
241
242
void TMZ1Setup_State_ShowCityBG(void)
243
{
244
RSDK_THIS(TMZ1Setup);
245
246
TMZ1Setup->stageState = TMZ1_STAGESTATE_CITY;
247
248
RSDK.GetTileLayer(0)->drawGroup[0] = DRAWGROUP_COUNT;
249
RSDK.GetTileLayer(1)->drawGroup[0] = DRAWGROUP_COUNT;
250
RSDK.GetTileLayer(2)->drawGroup[0] = 0;
251
RSDK.GetTileLayer(3)->drawGroup[0] = 0;
252
253
RSDK.CopyPalette(3, 128, 0, 128, 80);
254
255
destroyEntity(self);
256
}
257
258
void TMZ1Setup_State_ShowSkyBG(void)
259
{
260
RSDK_THIS(TMZ1Setup);
261
262
TMZ1Setup->stageState = TMZ1_STAGESTATE_SKY;
263
264
RSDK.GetTileLayer(0)->drawGroup[0] = 0;
265
RSDK.GetTileLayer(1)->drawGroup[0] = 0;
266
RSDK.GetTileLayer(2)->drawGroup[0] = DRAWGROUP_COUNT;
267
RSDK.GetTileLayer(3)->drawGroup[0] = DRAWGROUP_COUNT;
268
269
RSDK.CopyPalette(4, 128, 0, 128, 80);
270
271
destroyEntity(self);
272
}
273
274
void TMZ1Setup_State_FadeIntoOutsideBGs(void)
275
{
276
RSDK_THIS(TMZ1Setup);
277
278
if (self->timer <= 0) {
279
if (TMZ1Setup->stageState)
280
RSDK.CopyPalette(4, 208, 0, 208, 48);
281
else
282
RSDK.CopyPalette(4, 128, 0, 128, 128);
283
284
destroyEntity(self);
285
}
286
else {
287
self->timer -= 8;
288
289
if (TMZ1Setup->stageState)
290
RSDK.SetLimitedFade(0, 3, 4, self->timer >> 1, 128, 207);
291
else
292
RSDK.SetLimitedFade(0, 4, 3, self->timer >> 1, 128, 207);
293
294
RSDK.SetLimitedFade(0, 4, 5, self->timer, 208, 256);
295
}
296
}
297
298
#if GAME_INCLUDE_EDITOR
299
void TMZ1Setup_EditorDraw(void) {}
300
301
void TMZ1Setup_EditorLoad(void)
302
{
303
RSDK_ACTIVE_VAR(BGSwitch, bgID);
304
RSDK_ENUM_VAR("City", TMZ1_BG_CITY);
305
RSDK_ENUM_VAR("Lift", TMZ1_BG_LIFT);
306
}
307
#endif
308
309
void TMZ1Setup_Serialize(void) {}
310
311