Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/SPZ/FilmProjector.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: FilmProjector Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectFilmProjector *FilmProjector;
11
12
void FilmProjector_Update(void)
13
{
14
RSDK_THIS(FilmProjector);
15
16
self->rotation += self->pathMovement != FLIP_NONE ? -4 : 4;
17
self->rotation &= 0x1FF;
18
19
RSDK.ProcessAnimation(&self->celluoidAnimator);
20
RSDK.ProcessAnimation(&self->eggmanAnimator);
21
}
22
23
void FilmProjector_LateUpdate(void) {}
24
25
void FilmProjector_StaticUpdate(void) {}
26
27
void FilmProjector_Draw(void)
28
{
29
RSDK_THIS(FilmProjector);
30
31
if (SceneInfo->currentDrawGroup == Zone->objectDrawGroup[1]) {
32
Vector2 drawPos;
33
self->drawFX &= ~FX_FLIP;
34
35
drawPos.y = self->position.y - 0x440000;
36
if (self->direction == FLIP_NONE) {
37
drawPos.x = self->position.x - 0x3C0000;
38
RSDK.DrawSprite(&self->celluoidAnimator, &drawPos, false);
39
self->drawFX |= FX_ROTATE;
40
41
RSDK.DrawSprite(&self->filmReelAnimator, &drawPos, false);
42
self->drawFX &= ~FX_ROTATE;
43
44
RSDK.DrawSprite(&self->reelEdgeAnimator, &drawPos, false);
45
drawPos.x += 0x680000;
46
}
47
else {
48
drawPos.x = self->position.x + 0x3C0000;
49
RSDK.DrawSprite(&self->celluoidAnimator, &drawPos, false);
50
self->drawFX |= FX_ROTATE;
51
52
RSDK.DrawSprite(&self->filmReelAnimator, &drawPos, false);
53
self->drawFX &= ~FX_ROTATE;
54
55
RSDK.DrawSprite(&self->reelEdgeAnimator, &drawPos, false);
56
drawPos.x -= 0x680000;
57
}
58
RSDK.DrawSprite(&self->celluoidAnimator, &drawPos, false);
59
60
self->drawFX |= FX_ROTATE;
61
RSDK.DrawSprite(&self->filmReelAnimator, &drawPos, false);
62
63
self->drawFX &= ~FX_ROTATE;
64
RSDK.DrawSprite(&self->reelEdgeAnimator, &drawPos, false);
65
66
// ???
67
// This is the ONLY reference to this in the entire game
68
// (Not counting the editor funcs since they're for RE2 and custom-made)
69
SceneInfo->effectGizmo = true;
70
71
self->drawFX |= FX_FLIP;
72
RSDK.DrawSprite(&self->projectorAnimator, NULL, false);
73
74
self->inkEffect = INK_BLEND;
75
RSDK.DrawSprite(&self->eggmanAnimator, &self->filmPos, false);
76
77
self->inkEffect = INK_NONE;
78
}
79
else {
80
RSDK.DrawSprite(&self->screenAnimator, &self->filmPos, false);
81
RSDK.DrawSprite(&self->eggmanAnimator, &self->filmPos, false);
82
RSDK.AddDrawListRef(Zone->objectDrawGroup[1], SceneInfo->entitySlot);
83
}
84
}
85
86
void FilmProjector_Create(void *data)
87
{
88
RSDK_THIS(FilmProjector);
89
90
RSDK.SetSpriteAnimation(FilmProjector->aniFrames, 0, &self->projectorAnimator, true, 0);
91
RSDK.SetSpriteAnimation(FilmProjector->aniFrames, 0, &self->screenAnimator, true, 1);
92
RSDK.SetSpriteAnimation(FilmProjector->aniFrames, 1, &self->filmReelAnimator, true, 0);
93
RSDK.SetSpriteAnimation(FilmProjector->aniFrames, 1, &self->reelEdgeAnimator, true, 1);
94
RSDK.SetSpriteAnimation(FilmProjector->aniFrames, 2, &self->celluoidAnimator, true, 0);
95
RSDK.SetSpriteAnimation(FilmProjector->aniFrames, 3, &self->eggmanAnimator, true, 1);
96
97
if (!SceneInfo->inEditor) {
98
self->active = ACTIVE_BOUNDS;
99
self->updateRange.x = 0x1000000;
100
self->updateRange.y = 0x1000000;
101
self->visible = true;
102
self->drawGroup = Zone->objectDrawGroup[0];
103
104
self->filmPos = self->position;
105
if (self->direction == FLIP_NONE)
106
self->filmPos.x += 0xB80000;
107
else
108
self->filmPos.x -= 0xB80000;
109
}
110
}
111
112
void FilmProjector_StageLoad(void) { FilmProjector->aniFrames = RSDK.LoadSpriteAnimation("SPZ1/FilmProjector.bin", SCOPE_STAGE); }
113
114
#if GAME_INCLUDE_EDITOR
115
void FilmProjector_EditorDraw(void)
116
{
117
RSDK_THIS(FilmProjector);
118
119
self->updateRange.x = 0x1000000;
120
self->updateRange.y = 0x1000000;
121
122
self->filmPos.x = self->position.x;
123
self->filmPos.y = self->position.y;
124
if (self->direction == FLIP_NONE)
125
self->filmPos.x += 0xB80000;
126
else
127
self->filmPos.x -= 0xB80000;
128
129
RSDK.DrawSprite(&self->screenAnimator, &self->filmPos, false);
130
RSDK.DrawSprite(&self->eggmanAnimator, &self->filmPos, false);
131
132
Vector2 drawPos;
133
self->drawFX &= ~FX_FLIP;
134
135
drawPos.y = self->position.y - 0x440000;
136
if (self->direction == FLIP_NONE) {
137
drawPos.x = self->position.x - 0x3C0000;
138
RSDK.DrawSprite(&self->celluoidAnimator, &drawPos, false);
139
self->drawFX |= FX_ROTATE;
140
141
RSDK.DrawSprite(&self->filmReelAnimator, &drawPos, false);
142
self->drawFX &= ~FX_ROTATE;
143
144
RSDK.DrawSprite(&self->reelEdgeAnimator, &drawPos, false);
145
drawPos.x += 0x680000;
146
}
147
else {
148
drawPos.x = self->position.x + 0x3C0000;
149
RSDK.DrawSprite(&self->celluoidAnimator, &drawPos, false);
150
self->drawFX |= FX_ROTATE;
151
152
RSDK.DrawSprite(&self->filmReelAnimator, &drawPos, false);
153
self->drawFX &= ~FX_ROTATE;
154
155
RSDK.DrawSprite(&self->reelEdgeAnimator, &drawPos, false);
156
drawPos.x -= 0x680000;
157
}
158
RSDK.DrawSprite(&self->celluoidAnimator, &drawPos, false);
159
160
self->drawFX |= FX_ROTATE;
161
RSDK.DrawSprite(&self->filmReelAnimator, &drawPos, false);
162
163
self->drawFX &= ~FX_ROTATE;
164
RSDK.DrawSprite(&self->reelEdgeAnimator, &drawPos, false);
165
166
self->drawFX |= FX_FLIP;
167
RSDK.DrawSprite(&self->projectorAnimator, NULL, false);
168
169
self->inkEffect = INK_BLEND;
170
RSDK.DrawSprite(&self->eggmanAnimator, &self->filmPos, false);
171
172
self->inkEffect = INK_NONE;
173
}
174
175
void FilmProjector_EditorLoad(void)
176
{
177
FilmProjector->aniFrames = RSDK.LoadSpriteAnimation("SPZ1/FilmProjector.bin", SCOPE_STAGE);
178
179
RSDK_ACTIVE_VAR(FilmProjector, direction);
180
RSDK_ENUM_VAR("Right", FLIP_NONE);
181
RSDK_ENUM_VAR("Left", FLIP_X);
182
183
// Confusing name, but controls what dir the projector wheels spin
184
RSDK_ACTIVE_VAR(FilmProjector, pathMovement);
185
RSDK_ENUM_VAR("Clockwise", FLIP_NONE);
186
RSDK_ENUM_VAR("Counter-Clockwise", FLIP_X);
187
}
188
#endif
189
190
void FilmProjector_Serialize(void)
191
{
192
RSDK_EDITABLE_VAR(FilmProjector, VAR_UINT8, direction);
193
RSDK_EDITABLE_VAR(FilmProjector, VAR_UINT8, pathMovement);
194
}
195
196