Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/MSZ/Honkytonk.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: Honkytonk Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectHonkytonk *Honkytonk;
11
12
void Honkytonk_Update(void)
13
{
14
RSDK_THIS(Honkytonk);
15
16
if (self->depression > 0)
17
self->depression = MAX(self->depression - 0x20000, 0);
18
19
foreach_active(Player, player)
20
{
21
int32 startX = player->position.x;
22
int32 startY = player->position.y;
23
int32 startXVel = player->velocity.x;
24
int32 startYVel = player->velocity.y;
25
26
Zone_RotateOnPivot(&player->position, &self->position, self->negAngle);
27
28
Vector2 pivotCenter = { 0, 0 };
29
Zone_RotateOnPivot(&player->velocity, &pivotCenter, self->negAngle);
30
31
if (Player_CheckCollisionTouch(player, self, &Honkytonk->hitboxTrigger)) {
32
Hitbox *playerHitbox = Player_GetHitbox(player);
33
self->depression = MAX(self->depression, player->position.y + ((playerHitbox->bottom + 12) << 16) - self->position.y);
34
}
35
36
if (Player_CheckCollisionTouch(player, self, &Honkytonk->hitboxRebound) && player->tileCollisions != TILECOLLISION_NONE) {
37
player->state = Player_State_Air;
38
player->onGround = false;
39
player->applyJumpCap = false;
40
player->velocity.y = -0x80000;
41
if (player->animator.animationID != ANI_JUMP)
42
RSDK.SetSpriteAnimation(player->aniFrames, ANI_SPRING_CS, &player->animator, true, 0);
43
44
player->velocity.y = CLAMP(player->velocity.y, -0x80000, -0x20000);
45
46
Zone_RotateOnPivot(&player->position, &self->position, self->angle);
47
Zone_RotateOnPivot(&player->velocity, &pivotCenter, self->angle);
48
49
float speeds[] = { 1.0, 1.25, 1.5, 0.75 };
50
int32 channel = RSDK.PlaySfx(Honkytonk->sfxPiano, false, 0xFF);
51
RSDK.SetChannelAttributes(channel, 1.0, 0.0, speeds[Zone->timer & 3]);
52
}
53
else {
54
player->position.x = startX;
55
player->position.y = startY;
56
player->velocity.x = startXVel;
57
player->velocity.y = startYVel;
58
}
59
}
60
61
if (self->depression >= 0x140000)
62
self->depression = 0x140000;
63
}
64
65
void Honkytonk_LateUpdate(void) {}
66
67
void Honkytonk_StaticUpdate(void) {}
68
69
void Honkytonk_Draw(void)
70
{
71
RSDK_THIS(Honkytonk);
72
73
self->animator.frameID = 4;
74
self->scale.y = 0x200;
75
RSDK.DrawSprite(&self->animator, NULL, false);
76
77
self->animator.frameID = 1;
78
79
Vector2 drawPos;
80
drawPos.x = self->position.x + (-0xC00 * RSDK.Sin256(self->angle));
81
drawPos.y = self->position.y + (-0xC00 * RSDK.Cos256(self->angle));
82
self->scale.y = ((self->depression + 0x20000) >> 7) / 24;
83
RSDK.DrawSprite(&self->animator, &drawPos, false);
84
85
self->animator.frameID = 3;
86
drawPos.x = self->position.x - (((0x80000 - self->depression) >> 8) * RSDK.Sin256(self->angle));
87
drawPos.y = self->position.y - (((0x80000 - self->depression) >> 8) * RSDK.Cos256(self->angle));
88
self->scale.y = 0x200 + ((self->depression >> 7) / 24);
89
RSDK.DrawSprite(&self->animator, &drawPos, false);
90
91
self->animator.frameID = 2;
92
drawPos.x += -0x400 * RSDK.Sin256(self->angle);
93
drawPos.y += -0x400 * RSDK.Cos256(self->angle);
94
self->scale.y = 0x200;
95
RSDK.DrawSprite(&self->animator, &drawPos, false);
96
}
97
98
void Honkytonk_Create(void *data)
99
{
100
RSDK_THIS(Honkytonk);
101
102
if (!SceneInfo->inEditor) {
103
RSDK.SetSpriteAnimation(Honkytonk->aniFrames, 0, &self->animator, true, 0);
104
105
self->active = ACTIVE_BOUNDS;
106
self->updateRange.x = 0x800000;
107
self->updateRange.y = 0x800000;
108
self->visible = true;
109
self->angle &= 0xFF;
110
self->drawGroup = Zone->objectDrawGroup[0];
111
self->negAngle = 0x100 - self->angle;
112
self->drawFX = FX_SCALE | FX_ROTATE;
113
self->scale.x = 0x200;
114
self->rotation = self->negAngle << 1;
115
}
116
}
117
118
void Honkytonk_StageLoad(void)
119
{
120
Honkytonk->aniFrames = RSDK.LoadSpriteAnimation("MSZ/HonkyTonk.bin", SCOPE_STAGE);
121
122
Honkytonk->hitboxTrigger.left = -24;
123
Honkytonk->hitboxTrigger.top = -12;
124
Honkytonk->hitboxTrigger.right = 24;
125
Honkytonk->hitboxTrigger.bottom = 12;
126
127
Honkytonk->hitboxRebound.left = -24;
128
Honkytonk->hitboxRebound.top = 6;
129
Honkytonk->hitboxRebound.right = 24;
130
Honkytonk->hitboxRebound.bottom = 12;
131
132
Honkytonk->sfxPiano = RSDK.GetSfx("MSZ/Piano00C2.wav");
133
}
134
135
#if GAME_INCLUDE_EDITOR
136
void Honkytonk_EditorDraw(void)
137
{
138
RSDK_THIS(Honkytonk);
139
140
RSDK.SetSpriteAnimation(Honkytonk->aniFrames, 0, &self->animator, true, 0);
141
142
int32 angle = self->angle;
143
self->angle &= 0xFF;
144
self->negAngle = 0x100 - self->angle;
145
self->drawFX = FX_SCALE | FX_ROTATE;
146
self->scale.x = 0x200;
147
self->rotation = self->negAngle << 1;
148
149
Honkytonk_Draw();
150
151
self->angle = angle;
152
}
153
154
void Honkytonk_EditorLoad(void) { Honkytonk->aniFrames = RSDK.LoadSpriteAnimation("MSZ/HonkyTonk.bin", SCOPE_STAGE); }
155
#endif
156
157
void Honkytonk_Serialize(void) { RSDK_EDITABLE_VAR(Honkytonk, VAR_ENUM, angle); }
158
159