Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/AIZ/AIZTornado.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: AIZTornado Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectAIZTornado *AIZTornado;
11
12
void AIZTornado_Update(void)
13
{
14
RSDK_THIS(AIZTornado);
15
self->prevPos.x = self->position.x;
16
self->prevPos.y = self->position.y;
17
StateMachine_Run(self->state);
18
19
self->animatorTornado.frameID = self->turnAngle >> 4;
20
RSDK.ProcessAnimation(&self->animatorPropeller);
21
RSDK.ProcessAnimation(&self->animatorPilot);
22
RSDK.ProcessAnimation(&self->animatorFlame);
23
}
24
25
void AIZTornado_LateUpdate(void) {}
26
27
void AIZTornado_StaticUpdate(void) {}
28
29
void AIZTornado_Draw(void)
30
{
31
RSDK_THIS(AIZTornado);
32
RSDK.DrawSprite(&self->animatorPilot, NULL, false);
33
RSDK.DrawSprite(&self->animatorPropeller, NULL, false);
34
RSDK.DrawSprite(&self->animatorTornado, NULL, false);
35
if (self->showFlame) {
36
Vector2 drawPos;
37
drawPos.x = self->position.x;
38
drawPos.y = self->position.y;
39
drawPos.y += AIZTornado->flameOffsets[self->animatorTornado.frameID];
40
RSDK.DrawSprite(&self->animatorFlame, &drawPos, false);
41
}
42
}
43
44
void AIZTornado_Create(void *data)
45
{
46
RSDK_THIS(AIZTornado);
47
if (!SceneInfo->inEditor) {
48
self->visible = true;
49
self->updateRange.x = 0x1000000;
50
self->updateRange.y = 0x1000000;
51
self->drawFX = FX_FLIP;
52
self->drawGroup = Zone->objectDrawGroup[0];
53
self->movePos.x = self->position.x;
54
self->movePos.y = self->position.y;
55
self->turnAngle = 48;
56
self->isStood = true;
57
self->offsetX = 0x80000;
58
self->showFlame = true;
59
60
if (RSDK.CheckSceneFolder("AIZ") || RSDK.CheckSceneFolder("Credits"))
61
self->active = ACTIVE_NORMAL;
62
63
if (!StarPost->postIDs[0]) {
64
self->active = ACTIVE_NORMAL;
65
self->state = AIZTornado_State_Move;
66
}
67
68
RSDK.SetSpriteAnimation(AIZTornado->aniFrames, 0, &self->animatorTornado, true, 0);
69
RSDK.SetSpriteAnimation(AIZTornado->aniFrames, 1, &self->animatorPropeller, true, 0);
70
RSDK.SetSpriteAnimation(AIZTornado->aniFrames, 2, &self->animatorFlame, true, 0);
71
if (GET_CHARACTER_ID(1) == ID_SONIC) // if sonic is the leader
72
RSDK.SetSpriteAnimation(AIZTornado->aniFrames, 6, &self->animatorPilot, true, 0);
73
else
74
RSDK.SetSpriteAnimation(AIZTornado->aniFrames, 3, &self->animatorPilot, true, 0);
75
}
76
}
77
78
void AIZTornado_StageLoad(void)
79
{
80
if (RSDK.CheckSceneFolder("AIZ") || RSDK.CheckSceneFolder("Credits"))
81
AIZTornado->aniFrames = RSDK.LoadSpriteAnimation("AIZ/AIZTornado.bin", SCOPE_STAGE);
82
}
83
84
void AIZTornado_HandleMovement(void)
85
{
86
RSDK_THIS(AIZTornado);
87
self->movePos.x += AIZTornadoPath->moveVel.x;
88
self->movePos.y += AIZTornadoPath->moveVel.y;
89
self->newPos.x = self->movePos.x;
90
self->newPos.y = self->movePos.y;
91
92
if (!self->disableInteractions) {
93
int32 x = self->movePos.x;
94
int32 y = self->movePos.y;
95
if (AIZTornadoPath->moveVel.y) {
96
self->turnAngle = 0;
97
}
98
else {
99
y = 0xA00 * RSDK.Sin256(2 * Zone->timer) + self->movePos.y;
100
self->turnAngle = (RSDK.Sin256(2 * Zone->timer) >> 3) + 32;
101
}
102
self->newPos.x += (x - self->movePos.x) >> 1;
103
self->newPos.y += (y - self->movePos.y) >> 1;
104
}
105
self->position.x = self->newPos.x;
106
self->position.y = self->newPos.y;
107
}
108
109
void AIZTornado_HandlePlayerCollisions(void)
110
{
111
RSDK_THIS(AIZTornado);
112
EntityPlayer *player = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);
113
Hitbox *hitbox = RSDK.GetHitbox(&self->animatorTornado, 0);
114
if (self->turnAngle >= 32)
115
player->drawGroup = self->drawGroup + 1;
116
else
117
player->drawGroup = self->drawGroup;
118
int32 x = self->position.x;
119
int32 y = self->position.y;
120
self->prevPos.x &= 0xFFFF0000;
121
self->prevPos.y &= 0xFFFF0000;
122
self->isStood = false;
123
self->moveVelocity.x = (x & 0xFFFF0000) - self->prevPos.x;
124
self->moveVelocity.y = (y & 0xFFFF0000) - self->prevPos.y;
125
self->position.x = self->prevPos.x;
126
self->position.y = self->prevPos.y;
127
128
if (Player_CheckCollisionPlatform(player, self, hitbox)) {
129
RSDK.SetSpriteAnimation(player->aniFrames, ANI_RIDE, &player->animator, false, 0);
130
player->state = Player_State_Static;
131
player->position.x += self->moveVelocity.x;
132
player->position.y += self->moveVelocity.y;
133
player->flailing = false;
134
self->isStood = true;
135
if (player->velocity.y > 0x10000) {
136
self->collideTimer = 0;
137
self->gravityForce = 0x20000;
138
}
139
}
140
self->position.x = x;
141
self->position.y = y;
142
}
143
144
void AIZTornado_State_Move(void)
145
{
146
RSDK_THIS(AIZTornado);
147
self->prevPos.x = self->position.x;
148
self->prevPos.y = self->position.y;
149
AIZTornado_HandleMovement();
150
if (!self->disableInteractions)
151
AIZTornado_HandlePlayerCollisions();
152
}
153
154
#if GAME_INCLUDE_EDITOR
155
void AIZTornado_EditorDraw(void)
156
{
157
RSDK_THIS(AIZTornado);
158
RSDK.SetSpriteAnimation(AIZTornado->aniFrames, 0, &self->animatorTornado, true, 0);
159
RSDK.SetSpriteAnimation(AIZTornado->aniFrames, 1, &self->animatorPropeller, true, 0);
160
RSDK.SetSpriteAnimation(AIZTornado->aniFrames, 2, &self->animatorFlame, true, 0);
161
RSDK.SetSpriteAnimation(AIZTornado->aniFrames, 3, &self->animatorPilot, true, 0);
162
163
RSDK.DrawSprite(&self->animatorPilot, NULL, false);
164
RSDK.DrawSprite(&self->animatorPropeller, NULL, false);
165
RSDK.DrawSprite(&self->animatorTornado, NULL, false);
166
}
167
168
void AIZTornado_EditorLoad(void) { AIZTornado->aniFrames = RSDK.LoadSpriteAnimation("AIZ/AIZTornado.bin", SCOPE_STAGE); }
169
#endif
170
171
void AIZTornado_Serialize(void) {}
172
173