Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/SSZ/Kanabun.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: Kanabun Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectKanabun *Kanabun;
11
12
void Kanabun_Update(void)
13
{
14
RSDK_THIS(Kanabun);
15
16
StateMachine_Run(self->state);
17
}
18
19
void Kanabun_LateUpdate(void) {}
20
21
void Kanabun_StaticUpdate(void) {}
22
23
void Kanabun_Draw(void)
24
{
25
RSDK_THIS(Kanabun);
26
27
RSDK.DrawSprite(&self->animator, NULL, false);
28
}
29
30
void Kanabun_Create(void *data)
31
{
32
RSDK_THIS(Kanabun);
33
34
if (!self->angleVel)
35
self->angleVel = 1;
36
37
if (!self->hVel) {
38
self->hDist = 1;
39
self->bobDist = 2;
40
self->hVel = 0x4000;
41
self->angleVel = 2;
42
}
43
44
self->drawFX = FX_FLIP | FX_ROTATE | FX_SCALE;
45
46
if (!SceneInfo->inEditor) {
47
self->visible = true;
48
self->drawGroup = Zone->objectDrawGroup[0];
49
self->startPos = self->position;
50
self->startDir = self->direction;
51
self->active = ACTIVE_BOUNDS;
52
self->updateRange.x = 0x800000;
53
self->updateRange.y = 0x800000;
54
RSDK.SetSpriteAnimation(Kanabun->aniFrames, 0, &self->animator, true, 0);
55
self->state = Kanabun_State_Init;
56
}
57
}
58
59
void Kanabun_StageLoad(void)
60
{
61
if (RSDK.CheckSceneFolder("SSZ1"))
62
Kanabun->aniFrames = RSDK.LoadSpriteAnimation("SSZ1/Kanabun.bin", SCOPE_STAGE);
63
else if (RSDK.CheckSceneFolder("SSZ2"))
64
Kanabun->aniFrames = RSDK.LoadSpriteAnimation("SSZ2/Kanabun.bin", SCOPE_STAGE);
65
66
Kanabun->hitboxBadnik.left = -6;
67
Kanabun->hitboxBadnik.top = -6;
68
Kanabun->hitboxBadnik.right = 6;
69
Kanabun->hitboxBadnik.bottom = 6;
70
71
DEBUGMODE_ADD_OBJ(Kanabun);
72
}
73
74
void Kanabun_DebugSpawn(void)
75
{
76
RSDK_THIS(DebugMode);
77
78
CREATE_ENTITY(Kanabun, NULL, self->position.x, self->position.y);
79
}
80
81
void Kanabun_DebugDraw(void)
82
{
83
RSDK.SetSpriteAnimation(Kanabun->aniFrames, 0, &DebugMode->animator, true, 0);
84
RSDK.DrawSprite(&DebugMode->animator, NULL, false);
85
}
86
87
void Kanabun_CheckPlayerCollisions(void)
88
{
89
RSDK_THIS(Kanabun);
90
91
foreach_active(Player, player)
92
{
93
if (Player_CheckBadnikTouch(player, self, &Kanabun->hitboxBadnik))
94
Player_CheckBadnikBreak(player, self, true);
95
}
96
}
97
98
void Kanabun_CheckOffScreen(void)
99
{
100
RSDK_THIS(Kanabun);
101
102
if (!RSDK.CheckOnScreen(self, NULL) && !RSDK.CheckPosOnScreen(&self->startPos, &self->updateRange)) {
103
self->position = self->startPos;
104
self->direction = self->startDir;
105
Kanabun_Create(NULL);
106
}
107
}
108
109
void Kanabun_HandleMovement(void)
110
{
111
RSDK_THIS(Kanabun);
112
113
self->position.x += self->velocity.x;
114
self->position.y = ((self->bobDist * RSDK.Sin512(self->angle)) << 8) + self->startPos.y;
115
116
self->angle += self->angleVel;
117
118
self->scale.x = (abs(RSDK.Sin512(((self->angle >> 1) + 0x80) & 0x1FF)) >> 1) + 0x100;
119
self->scale.y = self->scale.x;
120
121
if (((uint32)(self->angle - 0x80) & 0x1FF) >= 0x100)
122
self->drawGroup = Zone->objectDrawGroup[1];
123
else
124
self->drawGroup = Zone->objectDrawGroup[0];
125
}
126
127
void Kanabun_State_Init(void)
128
{
129
RSDK_THIS(Kanabun);
130
131
self->velocity.x = self->hVel;
132
if (self->direction == FLIP_NONE)
133
self->velocity.x = -self->velocity.x;
134
135
self->active = ACTIVE_NORMAL;
136
137
self->state = Kanabun_State_Moving;
138
Kanabun_State_Moving();
139
}
140
141
void Kanabun_State_Moving(void)
142
{
143
RSDK_THIS(Kanabun);
144
145
Kanabun_HandleMovement();
146
147
if (self->position.y >= self->startPos.y) {
148
if (self->groundVel == 1)
149
self->groundVel = 0;
150
}
151
else {
152
if (!self->groundVel)
153
self->groundVel = 1;
154
}
155
156
int32 offset = self->hVel * self->hDist * (0x100 / self->angleVel);
157
158
if ((self->direction == FLIP_NONE && self->position.x <= (self->startPos.x - offset))
159
|| (self->direction == FLIP_X && self->position.x >= (self->startPos.x + offset))) {
160
RSDK.SetSpriteAnimation(Kanabun->aniFrames, 1, &self->animator, true, 0);
161
self->state = Kanabun_State_Turning;
162
}
163
164
RSDK.ProcessAnimation(&self->animator);
165
166
if (self->drawGroup == Zone->objectDrawGroup[1])
167
Kanabun_CheckPlayerCollisions();
168
169
Kanabun_CheckOffScreen();
170
}
171
172
void Kanabun_State_Turning(void)
173
{
174
RSDK_THIS(Kanabun);
175
176
Kanabun_HandleMovement();
177
178
RSDK.ProcessAnimation(&self->animator);
179
180
if (self->animator.frameID == self->animator.frameCount - 1) {
181
RSDK.SetSpriteAnimation(Kanabun->aniFrames, 0, &self->animator, true, 0);
182
self->velocity.x = -self->velocity.x;
183
self->groundVel = 0;
184
self->direction ^= FLIP_X;
185
self->state = Kanabun_State_Moving;
186
}
187
else {
188
if (self->drawGroup == Zone->objectDrawGroup[1])
189
Kanabun_CheckPlayerCollisions();
190
191
Kanabun_CheckOffScreen();
192
}
193
}
194
195
#if GAME_INCLUDE_EDITOR
196
void Kanabun_EditorDraw(void)
197
{
198
RSDK_THIS(Kanabun);
199
200
RSDK.SetSpriteAnimation(Kanabun->aniFrames, 0, &self->animator, false, 0);
201
self->scale.x = 0x200;
202
self->scale.y = 0x200;
203
204
Kanabun_Draw();
205
}
206
207
void Kanabun_EditorLoad(void)
208
{
209
if (RSDK.CheckSceneFolder("SSZ1"))
210
Kanabun->aniFrames = RSDK.LoadSpriteAnimation("SSZ1/Kanabun.bin", SCOPE_STAGE);
211
else if (RSDK.CheckSceneFolder("SSZ2"))
212
Kanabun->aniFrames = RSDK.LoadSpriteAnimation("SSZ2/Kanabun.bin", SCOPE_STAGE);
213
214
RSDK_ACTIVE_VAR(Kanabun, direction);
215
RSDK_ENUM_VAR("Left", FLIP_NONE);
216
RSDK_ENUM_VAR("Right", FLIP_X);
217
}
218
#endif
219
220
void Kanabun_Serialize(void)
221
{
222
RSDK_EDITABLE_VAR(Kanabun, VAR_ENUM, hVel);
223
RSDK_EDITABLE_VAR(Kanabun, VAR_UINT8, hDist);
224
RSDK_EDITABLE_VAR(Kanabun, VAR_UINT8, bobDist);
225
RSDK_EDITABLE_VAR(Kanabun, VAR_UINT8, angleVel);
226
RSDK_EDITABLE_VAR(Kanabun, VAR_UINT8, direction);
227
}
228
229