Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/UFO/UFO_Shadow.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: UFO_Shadow Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectUFO_Shadow *UFO_Shadow;
11
12
void UFO_Shadow_Update(void) {}
13
14
void UFO_Shadow_LateUpdate(void)
15
{
16
RSDK_THIS(UFO_Shadow);
17
Entity *parent = self->parent;
18
19
if (parent->classID) {
20
self->position.x = parent->position.x;
21
self->position.y = parent->position.y;
22
23
if (RSDK.GetTile(UFO_Setup->playFieldLayer, self->position.x >> 20, self->position.y >> 20) == (uint16)-1 || parent->drawGroup != 4) {
24
self->visible = false;
25
}
26
else {
27
self->visible = true;
28
int32 x = self->position.x >> 8;
29
int32 z = self->position.y >> 8;
30
Matrix *mat = &UFO_Camera->matWorld;
31
32
self->zdepth = mat->values[2][3] + (z * mat->values[2][2] >> 8) + (x * mat->values[2][0] >> 8);
33
34
if (self->zdepth >= 0x4000) {
35
self->visible =
36
abs((int32)((mat->values[0][3] << 8) + ((z * mat->values[0][2]) & 0xFFFFFF00) + ((x * mat->values[0][0]) & 0xFFFFFF00))
37
/ self->zdepth)
38
< 0x100;
39
}
40
}
41
}
42
else {
43
destroyEntity(self);
44
}
45
}
46
47
void UFO_Shadow_StaticUpdate(void) {}
48
49
void UFO_Shadow_Draw(void)
50
{
51
RSDK_THIS(UFO_Shadow);
52
53
if (self->zdepth >= 0x4000) {
54
RSDK.MatrixScaleXYZ(&self->matrix, self->shadowScale, 0x100, self->shadowScale);
55
RSDK.MatrixTranslateXYZ(&self->matrix, self->position.x, 0, self->position.y, 0);
56
RSDK.MatrixMultiply(&self->matrix, &self->matrix, &UFO_Camera->matWorld);
57
58
RSDK.Prepare3DScene(UFO_Shadow->sceneID);
59
RSDK.AddModelTo3DScene(UFO_Shadow->modelIndex, UFO_Shadow->sceneID, S3D_SOLIDCOLOR_SCREEN, &self->matrix, 0, 0);
60
RSDK.Draw3DScene(UFO_Shadow->sceneID);
61
}
62
}
63
64
void UFO_Shadow_Create(void *data)
65
{
66
RSDK_THIS(UFO_Shadow);
67
68
if (!SceneInfo->inEditor) {
69
self->inkEffect = INK_BLEND;
70
self->visible = true;
71
self->drawFX = FX_SCALE;
72
self->drawGroup = 3;
73
self->active = ACTIVE_RBOUNDS;
74
self->updateRange.x = 0x300;
75
self->updateRange.y = 0x300;
76
}
77
}
78
79
void UFO_Shadow_StageLoad(void)
80
{
81
UFO_Shadow->modelIndex = RSDK.LoadMesh("Special/Shadow.bin", SCOPE_STAGE);
82
UFO_Shadow->sceneID = RSDK.Create3DScene("View:Special", 4096, SCOPE_STAGE);
83
84
int32 slot = TEMPENTITY_START;
85
foreach_all(UFO_Player, player)
86
{
87
EntityUFO_Shadow *shadow = RSDK_GET_ENTITY(slot--, UFO_Shadow);
88
RSDK.ResetEntity(shadow, UFO_Shadow->classID, NULL);
89
shadow->position.x = player->position.x;
90
shadow->position.y = player->position.y;
91
shadow->parent = (Entity *)player;
92
shadow->shadowScale = 0x140;
93
}
94
95
foreach_all(UFO_Circuit, ufo)
96
{
97
if (ufo->startNode) {
98
EntityUFO_Shadow *shadow = RSDK_GET_ENTITY(slot--, UFO_Shadow);
99
RSDK.ResetEntity(shadow, UFO_Shadow->classID, NULL);
100
shadow->position.x = ufo->position.x;
101
shadow->position.y = ufo->position.y;
102
shadow->parent = (Entity *)ufo;
103
shadow->shadowScale = 0x400;
104
}
105
}
106
107
foreach_all(UFO_Ring, ring)
108
{
109
EntityUFO_Shadow *shadow = RSDK_GET_ENTITY(slot--, UFO_Shadow);
110
RSDK.ResetEntity(shadow, UFO_Shadow->classID, NULL);
111
shadow->position.x = ring->position.x;
112
shadow->position.y = ring->position.y;
113
shadow->parent = (Entity *)ring;
114
shadow->shadowScale = 0xC0;
115
}
116
117
foreach_all(UFO_Sphere, sphere)
118
{
119
EntityUFO_Shadow *shadow = RSDK_GET_ENTITY(slot--, UFO_Shadow);
120
RSDK.ResetEntity(shadow, UFO_Shadow->classID, NULL);
121
shadow->position.x = sphere->position.x;
122
shadow->position.y = sphere->position.y;
123
shadow->parent = (Entity *)sphere;
124
shadow->shadowScale = 0x100;
125
}
126
127
LogHelpers_Print("%d shadow entities spawned", TEMPENTITY_START - slot);
128
}
129
130
#if GAME_INCLUDE_EDITOR
131
void UFO_Shadow_EditorDraw(void) {}
132
133
void UFO_Shadow_EditorLoad(void) {}
134
#endif
135
136
void UFO_Shadow_Serialize(void) {}
137
138