Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/UFO/UFO_Springboard.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: UFO_Springboard Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectUFO_Springboard *UFO_Springboard;
11
12
void UFO_Springboard_Update(void)
13
{
14
RSDK_THIS(UFO_Springboard);
15
foreach_active(UFO_Player, player)
16
{
17
if (player->bumperTimer <= 12 && player->stateInput) {
18
Vector2 pivotPos = player->position;
19
Zone_RotateOnPivot(&pivotPos, &self->position, self->angle >> 2);
20
21
if (abs(self->position.x - pivotPos.x) < 0x180000 && abs(self->position.y - pivotPos.y) < 0x180000) {
22
int32 height = 32 * ((pivotPos.y - self->position.y + 0x180000) / 48);
23
if (player->height < height) {
24
if (height - player->height <= 0xC0000) {
25
player->gravityStrength = 0xC0000;
26
player->onGround = false;
27
player->state = UFO_Player_State_Springboard;
28
RSDK.SetModelAnimation(UFO_Player->jumpModel, &player->animator, 128, 0, true, 0);
29
RSDK.PlaySfx(UFO_Player->sfxSpring, false, 255);
30
}
31
else {
32
player->bumperTimer = 16;
33
player->velocity.x = -player->velocity.x;
34
player->velocity.y = -player->velocity.y;
35
RSDK.PlaySfx(UFO_Player->sfxBumper, false, 255);
36
}
37
}
38
}
39
}
40
}
41
42
if (RSDK.CheckOnScreen(self, 0)) {
43
if (self->scale.x < 0x100)
44
self->scale.x += 0x10;
45
46
self->active = ACTIVE_NORMAL;
47
}
48
else {
49
self->scale.x = 0x000;
50
self->active = ACTIVE_BOUNDS;
51
}
52
}
53
54
void UFO_Springboard_LateUpdate(void)
55
{
56
RSDK_THIS(UFO_Springboard);
57
58
int32 x = self->position.x;
59
int32 y = self->height;
60
int32 z = self->position.y;
61
62
Matrix *m = &UFO_Camera->matWorld;
63
64
self->zdepth = m->values[2][1] * (y >> 16) + m->values[2][2] * (z >> 16) + m->values[2][0] * (x >> 16) + m->values[2][3];
65
if (self->zdepth >= 0x4000) {
66
int32 depth = (int32)((m->values[0][3] << 8) + (m->values[0][2] * (z >> 8) & 0xFFFFFF00) + (m->values[0][0] * (x >> 8) & 0xFFFFFF00)
67
+ (m->values[0][1] * (self->height >> 8) & 0xFFFFFF00))
68
/ self->zdepth;
69
70
self->visible = abs(depth) < 0x100;
71
}
72
}
73
74
void UFO_Springboard_StaticUpdate(void) {}
75
76
void UFO_Springboard_Draw(void)
77
{
78
RSDK_THIS(UFO_Springboard);
79
80
if (self->zdepth >= 0x4000) {
81
RSDK.Prepare3DScene(UFO_Springboard->sceneIndex);
82
83
RSDK.MatrixScaleXYZ(&self->matTemp, 0x100, self->scale.x, 0x100);
84
RSDK.MatrixTranslateXYZ(&self->matTemp, self->position.x, self->height, self->position.y, 0);
85
86
RSDK.MatrixRotateY(&self->matNormal, self->angle);
87
RSDK.MatrixMultiply(&self->matWorld, &self->matNormal, &self->matTemp);
88
RSDK.MatrixMultiply(&self->matWorld, &self->matWorld, &UFO_Camera->matWorld);
89
RSDK.MatrixMultiply(&self->matNormal, &self->matNormal, &UFO_Camera->matView);
90
91
RSDK.AddMeshFrameTo3DScene(UFO_Springboard->modelIndex, UFO_Springboard->sceneIndex, &self->animator, S3D_SOLIDCOLOR_SHADED_BLENDED_SCREEN,
92
&self->matWorld, &self->matNormal, 0xFFFFFF);
93
94
RSDK.Draw3DScene(UFO_Springboard->sceneIndex);
95
}
96
}
97
98
void UFO_Springboard_Create(void *data)
99
{
100
RSDK_THIS(UFO_Springboard);
101
102
if (!SceneInfo->inEditor) {
103
self->visible = true;
104
self->drawGroup = 4;
105
self->active = ACTIVE_BOUNDS;
106
self->updateRange.x = 0x5000000;
107
self->updateRange.y = 0x5000000;
108
}
109
}
110
111
void UFO_Springboard_StageLoad(void)
112
{
113
UFO_Springboard->modelIndex = RSDK.LoadMesh("Special/Springboard.bin", SCOPE_STAGE);
114
UFO_Springboard->sceneIndex = RSDK.Create3DScene("View:Special", 4096, SCOPE_STAGE);
115
}
116
117
#if GAME_INCLUDE_EDITOR
118
void UFO_Springboard_EditorDraw(void) {}
119
120
void UFO_Springboard_EditorLoad(void) {}
121
#endif
122
123
void UFO_Springboard_Serialize(void)
124
{
125
RSDK_EDITABLE_VAR(UFO_Springboard, VAR_ENUM, angle);
126
RSDK_EDITABLE_VAR(UFO_Springboard, VAR_UINT8, rampCount);
127
}
128
129