Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/Helpers/PlayerProbe.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: PlayerProbe Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectPlayerProbe *PlayerProbe;
11
12
void PlayerProbe_Update(void)
13
{
14
RSDK_THIS(PlayerProbe);
15
16
// Pretty much just an edit of the PlaneSwitch collision code
17
foreach_active(Player, player)
18
{
19
int32 playerID = RSDK.GetEntitySlot(player);
20
21
Vector2 pivotPos = player->position;
22
Vector2 pivotVel = player->velocity;
23
24
Zone_RotateOnPivot(&pivotPos, &self->position, self->negAngle);
25
Zone_RotateOnPivot(&pivotVel, &self->velocity, self->negAngle);
26
27
if (abs(pivotPos.x - self->position.x) < TO_FIXED(24) && abs(pivotPos.y - self->position.y) < self->size << 19) {
28
if (pivotPos.x >= self->position.x) {
29
if (!self->direction) {
30
if (!((1 << playerID) & self->activePlayers))
31
PlayerProbe_Print(player);
32
33
self->activePlayers |= 1 << playerID;
34
}
35
}
36
else {
37
if (self->direction) {
38
if (!((1 << playerID) & self->activePlayers))
39
PlayerProbe_Print(player);
40
41
self->activePlayers |= 1 << playerID;
42
}
43
}
44
}
45
else {
46
self->activePlayers &= ~(1 << playerID);
47
}
48
}
49
50
self->visible = DebugMode->debugActive;
51
}
52
53
void PlayerProbe_LateUpdate(void) {}
54
55
void PlayerProbe_StaticUpdate(void) {}
56
57
void PlayerProbe_Draw(void) { PlayerProbe_DrawSprites(); }
58
59
void PlayerProbe_Create(void *data)
60
{
61
RSDK_THIS(PlayerProbe);
62
63
RSDK.SetSpriteAnimation(PlayerProbe->aniFrames, 0, &self->animator, true, 0);
64
65
self->drawFX |= FX_FLIP;
66
self->active = ACTIVE_BOUNDS;
67
self->animator.frameID = 4;
68
69
self->updateRange.x = TO_FIXED(32) + abs(self->size * RSDK.Sin256(self->angle) << 11);
70
self->updateRange.y = TO_FIXED(32) + abs(self->size * RSDK.Cos256(self->angle) << 11);
71
self->visible = false;
72
self->drawGroup = Zone->objectDrawGroup[0];
73
self->activePlayers = 0;
74
self->negAngle = -self->angle & 0xFF;
75
}
76
77
void PlayerProbe_StageLoad(void) { PlayerProbe->aniFrames = RSDK.LoadSpriteAnimation("Global/PlaneSwitch.bin", SCOPE_STAGE); }
78
79
void PlayerProbe_Print(EntityPlayer *player)
80
{
81
RSDK_THIS(PlayerProbe);
82
if (!SceneInfo->inEditor) {
83
84
LogHelpers_Print("====================");
85
LogHelpers_Print("= Begin Probe =");
86
LogHelpers_Print("====================");
87
88
if (self->direction)
89
LogHelpers_Print("self->direction = S/U");
90
else
91
LogHelpers_Print("self->direction = U/S");
92
93
LogHelpers_Print("self->angle = %i", self->angle);
94
LogHelpers_Print("Cos256(self->angle) = %i", RSDK.Cos256(self->angle));
95
LogHelpers_Print("Sin256(self->angle) = %i", RSDK.Sin256(self->angle));
96
LogHelpers_Print("====================");
97
98
if (player->direction)
99
LogHelpers_Print("self->direction = FACING_LEFT");
100
else
101
LogHelpers_Print("self->direction = FACING_RIGHT");
102
103
LogHelpers_Print("playerPtr->groundVel = %i", player->groundVel);
104
LogHelpers_Print("playerPtr->angle = %i", player->angle);
105
LogHelpers_Print("playerPtr->collisionMode = %i", player->collisionMode);
106
LogHelpers_Print("playerPtr->onGround = %i", player->onGround);
107
108
LogHelpers_Print("====================");
109
LogHelpers_Print("= End Probe =");
110
LogHelpers_Print("====================");
111
}
112
}
113
114
void PlayerProbe_DrawSprites(void)
115
{
116
RSDK_THIS(PlayerProbe);
117
118
Vector2 drawPos;
119
120
drawPos.x = self->position.x;
121
drawPos.y = self->position.y - (self->size << 19);
122
Zone_RotateOnPivot(&drawPos, &self->position, self->angle);
123
124
for (int32 i = 0; i < self->size; ++i) {
125
RSDK.DrawSprite(&self->animator, &drawPos, false);
126
drawPos.x += RSDK.Sin256(self->angle) << 12;
127
drawPos.y += RSDK.Cos256(self->angle) << 12;
128
}
129
130
if (SceneInfo->inEditor) {
131
uint8 angle = -(uint8)(self->angle);
132
if (self->direction)
133
angle = -0x80 - (uint8)(self->angle);
134
135
int32 x2 = self->position.x + 0x5000 * RSDK.Cos256(angle);
136
int32 y2 = self->position.y + 0x5000 * RSDK.Sin256(angle);
137
PlayerProbe_DrawArrow(self->position.x, self->position.y, x2, y2, !self->direction ? 0x00FFFF : 0xFF00FF);
138
}
139
}
140
141
void PlayerProbe_DrawArrow(int32 x1, int32 y1, int32 x2, int32 y2, uint32 color)
142
{
143
int32 angle = RSDK.ATan2(x1 - x2, y1 - y2);
144
145
RSDK.DrawLine(x1, y1, x2, y2, color, 0x7F, INK_ADD, false);
146
RSDK.DrawLine(x2, y2, x2 + (RSDK.Cos256(angle + 12) << 12), (RSDK.Sin256(angle + 12) << 12) + y2, color, 0x7F, INK_ADD, false);
147
RSDK.DrawLine(x2, y2, (RSDK.Cos256(angle - 12) << 12) + x2, (RSDK.Sin256(angle - 12) << 12) + y2, color, 0x7F, INK_ADD, false);
148
}
149
150
#if GAME_INCLUDE_EDITOR
151
void PlayerProbe_EditorDraw(void)
152
{
153
RSDK_THIS(PlayerProbe);
154
155
self->updateRange.x = TO_FIXED(32) + abs(self->size * RSDK.Sin256(self->angle) << 11);
156
self->updateRange.y = TO_FIXED(32) + abs(self->size * RSDK.Cos256(self->angle) << 11);
157
self->visible = true;
158
self->drawGroup = Zone ? Zone->objectDrawGroup[0] : 2;
159
160
PlayerProbe_DrawSprites();
161
}
162
163
void PlayerProbe_EditorLoad(void)
164
{
165
PlayerProbe->aniFrames = RSDK.LoadSpriteAnimation("Global/PlaneSwitch.bin", SCOPE_STAGE);
166
167
RSDK_ACTIVE_VAR(PlayerProbe, direction);
168
RSDK_ENUM_VAR("U/S", FLIP_NONE);
169
RSDK_ENUM_VAR("S/U", FLIP_X);
170
}
171
#endif
172
173
void PlayerProbe_Serialize(void)
174
{
175
RSDK_EDITABLE_VAR(PlayerProbe, VAR_UINT8, direction);
176
RSDK_EDITABLE_VAR(PlayerProbe, VAR_ENUM, size);
177
RSDK_EDITABLE_VAR(PlayerProbe, VAR_INT32, angle);
178
}
179
180