Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/UFO/UFO_Camera.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: UFO_Camera Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectUFO_Camera *UFO_Camera;
11
12
void UFO_Camera_Update(void) {}
13
14
void UFO_Camera_LateUpdate(void)
15
{
16
RSDK_THIS(UFO_Camera);
17
18
StateMachine_Run(self->state);
19
20
UFO_Camera_HandleCamPos();
21
}
22
23
void UFO_Camera_StaticUpdate(void) {}
24
25
void UFO_Camera_Draw(void) {}
26
27
void UFO_Camera_Create(void *data)
28
{
29
RSDK_THIS(UFO_Camera);
30
31
self->active = ACTIVE_NORMAL;
32
self->state = UFO_Camera_State_Normal;
33
self->height = 0x300000;
34
self->radius = 0x2800;
35
36
foreach_all(UFO_Player, player)
37
{
38
player->camera = self;
39
self->target = (Entity *)player;
40
}
41
}
42
43
void UFO_Camera_StageLoad(void)
44
{
45
RSDK.ResetEntitySlot(SLOT_UFO_CAMERA, UFO_Camera->classID, NULL);
46
47
UFO_Camera->isSS7 = RSDK.CheckSceneFolder("UFO7");
48
}
49
50
void UFO_Camera_HandleCamPos(void)
51
{
52
RSDK_THIS(UFO_Camera);
53
54
int32 cos = MAX(RSDK.Cos1024(-self->angleX) << 12, 0x3C0000);
55
56
int32 angle = self->angle - self->prevAngle;
57
int32 angle2 = angle - 0x400;
58
if (self->angle <= 0x200)
59
angle2 = angle + 0x400;
60
61
if (abs(angle) >= abs(angle2))
62
ScreenInfo->position.x -= 2 * angle2;
63
else
64
ScreenInfo->position.x -= 2 * angle;
65
66
int32 offset = ((RSDK.Sin1024(-self->angleX) << 12) << 8) / cos;
67
ScreenInfo->position.y = offset - ScreenInfo->center.y + 512;
68
self->prevAngle = self->angle;
69
70
self->clipY = CLAMP(ScreenInfo->center.y - offset + 8, -0x40, ScreenInfo->size.y);
71
}
72
73
void UFO_Camera_State_Normal(void)
74
{
75
RSDK_THIS(UFO_Camera);
76
77
EntityUFO_Player *target = (EntityUFO_Player *)self->target;
78
79
if (target) {
80
int32 negAngle = (-0x200 - target->angle) & 0x3FF;
81
int32 rot = negAngle - self->angle;
82
83
if (abs(rot) >= abs(rot - 0x400)) {
84
if (abs(rot - 0x400) < abs(rot + 0x400))
85
self->angle += (rot - 0x400) >> 3;
86
else
87
self->angle += (rot + 0x400) >> 3;
88
}
89
else {
90
if (abs(rot) < abs(rot + 0x400))
91
self->angle += rot >> 3;
92
else
93
self->angle += (rot + 0x400) >> 3;
94
}
95
96
self->angle &= 0x3FF;
97
if (target->state == UFO_Player_State_Springboard) {
98
self->angleX = -(target->height >> 18);
99
int32 rad = self->radius * RSDK.Cos1024(self->angleX) >> 10;
100
101
self->position.x = target->position.x - rad * RSDK.Sin1024(self->angle);
102
self->position.y = target->position.y - rad * RSDK.Cos1024(self->angle);
103
104
self->height = (target->height >> 1) - (RSDK.Sin1024(self->angleX) << 14) + 0x400000;
105
}
106
else {
107
self->angleX = 0;
108
self->position.x = target->position.x - self->radius * RSDK.Sin1024(self->angle);
109
self->position.y = target->position.y - self->radius * RSDK.Cos1024(self->angle);
110
self->height = (target->height >> 2) + 0x400000;
111
}
112
}
113
114
RSDK.MatrixTranslateXYZ(&self->matWorld, -self->position.x, -self->height, -self->position.y, true);
115
RSDK.MatrixRotateXYZ(&UFO_Camera->matView, self->angleX, self->angle, 0);
116
117
RSDK.MatrixMultiply(&UFO_Camera->matWorld, &self->matWorld, &UFO_Camera->matView);
118
RSDK.MatrixScaleXYZ(&self->matWorld, -0x100, 0x100, 0x100);
119
120
RSDK.MatrixMultiply(&UFO_Camera->matView, &UFO_Camera->matView, &self->matWorld);
121
122
if (UFO_Camera->isSS7) {
123
RSDK.MatrixRotateXYZ(&UFO_Camera->matTemp, self->angleX + 4 * UFO_Setup->timer, self->angle, 0);
124
RSDK.MatrixMultiply(&UFO_Camera->matTemp, &UFO_Camera->matTemp, &self->matWorld);
125
}
126
127
RSDK.MatrixMultiply(&UFO_Camera->matWorld, &UFO_Camera->matWorld, &self->matWorld);
128
}
129
130
void UFO_Camera_State_CourseOut(void)
131
{
132
RSDK_THIS(UFO_Camera);
133
134
self->height += 0x20000;
135
136
if (self->angleX > -0x100)
137
self->angleX -= 4;
138
139
self->angle += 2;
140
141
RSDK.MatrixTranslateXYZ(&self->matWorld, -self->position.x, -self->height, -self->position.y, true);
142
RSDK.MatrixRotateXYZ(&UFO_Camera->matView, self->angleX, self->angle, 0);
143
144
RSDK.MatrixMultiply(&UFO_Camera->matWorld, &self->matWorld, &UFO_Camera->matView);
145
RSDK.MatrixScaleXYZ(&self->matWorld, -0x100, 0x100, 0x100);
146
147
RSDK.MatrixMultiply(&UFO_Camera->matView, &UFO_Camera->matView, &self->matWorld);
148
RSDK.MatrixMultiply(&UFO_Camera->matWorld, &UFO_Camera->matWorld, &self->matWorld);
149
}
150
151
void UFO_Camera_State_UFOCaught(void)
152
{
153
RSDK_THIS(UFO_Camera);
154
155
self->height += 0x80000;
156
if (self->angleX > -0x100)
157
self->angleX -= 8;
158
159
self->position.x += RSDK.Sin1024(self->angle) << 8;
160
self->position.y += RSDK.Cos1024(self->angle) << 8;
161
162
RSDK.MatrixTranslateXYZ(&self->matWorld, -self->position.x, -self->height, -self->position.y, true);
163
RSDK.MatrixRotateXYZ(&UFO_Camera->matView, self->angleX, self->angle, 0);
164
165
RSDK.MatrixMultiply(&UFO_Camera->matWorld, &self->matWorld, &UFO_Camera->matView);
166
RSDK.MatrixScaleXYZ(&self->matWorld, -0x100, 0x100, 0x100);
167
168
RSDK.MatrixMultiply(&UFO_Camera->matView, &UFO_Camera->matView, &self->matWorld);
169
RSDK.MatrixMultiply(&UFO_Camera->matWorld, &UFO_Camera->matWorld, &self->matWorld);
170
}
171
172
#if GAME_INCLUDE_EDITOR
173
void UFO_Camera_EditorDraw(void) {}
174
175
void UFO_Camera_EditorLoad(void) {}
176
#endif
177
178
void UFO_Camera_Serialize(void) {}
179
180