Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/Puyo/PuyoLevelSelect.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: PuyoLevelSelect Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectPuyoLevelSelect *PuyoLevelSelect;
11
12
void PuyoLevelSelect_Update(void)
13
{
14
RSDK_THIS(PuyoLevelSelect);
15
16
if (self->canSelectLevels) {
17
self->visible = !self->ready;
18
19
int32 controllerID = self->playerID + 1;
20
21
RSDKControllerState *controller = &ControllerInfo[controllerID];
22
23
self->up = controller->keyUp.press || AnalogStickInfoL[controllerID].keyUp.press;
24
self->down = controller->keyDown.press || AnalogStickInfoL[controllerID].keyDown.press;
25
26
if (API_GetConfirmButtonFlip()) {
27
self->confirmPress = controller->keyB.press;
28
self->backPress = controller->keyA.press;
29
}
30
else {
31
self->confirmPress = controller->keyA.press;
32
self->backPress = controller->keyB.press;
33
}
34
35
PuyoLevelSelect_HandleMenuMovement();
36
}
37
else {
38
self->visible = false;
39
}
40
}
41
42
void PuyoLevelSelect_LateUpdate(void) {}
43
44
void PuyoLevelSelect_StaticUpdate(void) {}
45
46
void PuyoLevelSelect_Draw(void) { PuyoLevelSelect_DrawSprites(); }
47
48
void PuyoLevelSelect_Create(void *data)
49
{
50
RSDK_THIS(PuyoLevelSelect);
51
52
self->active = ACTIVE_NORMAL;
53
self->drawGroup = 10;
54
self->visible = true;
55
self->updateRange.x = 0x800000;
56
self->updateRange.y = 0x800000;
57
}
58
59
void PuyoLevelSelect_StageLoad(void)
60
{
61
PuyoLevelSelect->aniFrames = RSDK.LoadSpriteAnimation("Puyo/PuyoUI.bin", SCOPE_STAGE);
62
63
PuyoLevelSelect->sfxMenuBleep = RSDK.GetSfx("Global/MenuBleep.wav");
64
PuyoLevelSelect->sfxMenuAccept = RSDK.GetSfx("Global/MenuAccept.wav");
65
}
66
67
void PuyoLevelSelect_DrawSprites(void)
68
{
69
RSDK_THIS(PuyoLevelSelect);
70
71
Vector2 drawPos;
72
drawPos.x = self->position.x + 0x30000;
73
drawPos.y = self->position.y + 0x30000;
74
self->inkEffect = INK_BLEND;
75
self->alpha = 0x7F;
76
RSDK.SetSpriteAnimation(PuyoLevelSelect->aniFrames, 0, &self->frameAnimator, true, 1);
77
RSDK.DrawSprite(&self->frameAnimator, &drawPos, false);
78
79
drawPos.x -= 0x30000;
80
drawPos.y -= 0x30000;
81
self->inkEffect = INK_NONE;
82
RSDK.SetSpriteAnimation(PuyoLevelSelect->aniFrames, 0, &self->frameAnimator, true, 0);
83
RSDK.DrawSprite(&self->frameAnimator, &drawPos, false);
84
85
drawPos.x = self->position.x;
86
drawPos.y = self->position.y - 0x500000;
87
RSDK.SetSpriteAnimation(PuyoLevelSelect->aniFrames, 1, &self->labelAnimator, true, 1);
88
RSDK.DrawSprite(&self->labelAnimator, &drawPos, false);
89
90
drawPos.x = self->position.x;
91
drawPos.y = self->position.y - 0x310000;
92
93
// Draw Levels
94
for (int32 i = 0; i < 5; ++i) {
95
if (i != self->optionID || (!(Zone->timer & 4))) {
96
RSDK.SetSpriteAnimation(PuyoLevelSelect->aniFrames, (i != self->optionID) + 4, &self->labelAnimator, true, i + 1);
97
RSDK.DrawSprite(&self->labelAnimator, &drawPos, false);
98
}
99
drawPos.y += 0x180000;
100
}
101
}
102
103
void PuyoLevelSelect_HandleMenuMovement(void)
104
{
105
RSDK_THIS(PuyoLevelSelect);
106
107
if (self->ready) {
108
if (self->backPress)
109
self->ready = false;
110
}
111
else if (self->up || self->down) {
112
if (self->up)
113
--self->optionID;
114
115
if (self->down)
116
++self->optionID;
117
118
if (self->optionID >= 5)
119
self->optionID -= 5;
120
121
if (self->optionID < 0)
122
self->optionID += 5;
123
124
RSDK.PlaySfx(PuyoLevelSelect->sfxMenuBleep, false, 255);
125
}
126
else if (self->confirmPress) {
127
self->ready = true;
128
RSDK.PlaySfx(PuyoLevelSelect->sfxMenuAccept, false, 255);
129
}
130
}
131
132
#if GAME_INCLUDE_EDITOR
133
void PuyoLevelSelect_EditorDraw(void) { PuyoLevelSelect_DrawSprites(); }
134
135
void PuyoLevelSelect_EditorLoad(void)
136
{
137
PuyoLevelSelect->aniFrames = RSDK.LoadSpriteAnimation("Puyo/PuyoUI.bin", SCOPE_STAGE);
138
139
RSDK_ACTIVE_VAR(PuyoLevelSelect, playerID);
140
RSDK_ENUM_VAR("Player 1", PUYOGAME_PLAYER1);
141
RSDK_ENUM_VAR("Player 2", PUYOGAME_PLAYER2);
142
}
143
#endif
144
145
void PuyoLevelSelect_Serialize(void) { RSDK_EDITABLE_VAR(PuyoLevelSelect, VAR_ENUM, playerID); }
146
147