Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-1-2-2013-Decompilation
Path: blob/main/RSDKv4/NativeObjects/AchievementsMenu.cpp
817 views
1
#include "RetroEngine.hpp"
2
3
#if !RETRO_USE_ORIGINAL_CODE
4
void AchievementsMenu_Create(void *objPtr)
5
{
6
RSDK_THIS(AchievementsMenu);
7
8
self->label = CREATE_ENTITY(TextLabel);
9
self->label->useRenderMatrix = true;
10
self->label->fontID = FONT_HEADING;
11
self->label->scale = 0.2;
12
self->label->alpha = 256;
13
self->label->x = -144.0;
14
self->label->y = 100.0;
15
self->label->z = 16.0;
16
self->label->state = TEXTLABEL_STATE_IDLE;
17
SetStringToFont(self->label->text, strAchievements, FONT_HEADING);
18
19
self->scale = 0;
20
self->arrowAlpha = 0;
21
22
self->meshPanel = LoadMesh("Data/Game/Models/Panel.bin", -1);
23
SetMeshVertexColors(self->meshPanel, 0, 0, 0, 0xC0);
24
self->textureArrows = LoadTexture("Data/Game/Menu/ArrowButtons.png", TEXFMT_RGBA4444);
25
26
char buffer[0x40];
27
char buffer2[0x80];
28
29
float y = 24.0f;
30
for (int i = 0; i < 5; ++i) {
31
self->displays[i] = CREATE_ENTITY(AchievementDisplay);
32
self->displays[i]->fontID = FONT_LABEL;
33
self->displays[i]->x = -112.0f;
34
self->displays[i]->y = y;
35
self->displays[i]->scale = 0.11;
36
self->displays[i]->state = achievements[i].status == 100;
37
self->displays[i]->useRenderMatrix = true;
38
39
StringUpperCase(buffer, achievements[i].name);
40
StringUpperCase(buffer2, achievements[i].desc);
41
SetStringToFont8(self->displays[i]->achievementText, buffer, self->displays[i]->fontID);
42
SetStringToFont8(self->displays[i]->descriptionText, buffer2, self->displays[i]->fontID);
43
44
y -= 96.0f;
45
}
46
}
47
void AchievementsMenu_Main(void *objPtr)
48
{
49
RSDK_THIS(AchievementsMenu);
50
51
switch (self->state) {
52
case 0: {
53
if (self->arrowAlpha < 0x100)
54
self->arrowAlpha += 8;
55
56
self->scale = fminf(self->scale + ((1.05 - self->scale) / ((60.0 * Engine.deltaTime) * 8.0)), 1.0f);
57
58
NewRenderState();
59
MatrixScaleXYZF(&self->renderMatrix, self->scale, self->scale, 1.0);
60
MatrixTranslateXYZF(&self->matrixTemp, 0.0, 0, 160.0);
61
MatrixMultiplyF(&self->renderMatrix, &self->matrixTemp);
62
SetRenderMatrix(&self->renderMatrix);
63
64
memcpy(&self->label->renderMatrix, &self->renderMatrix, sizeof(MatrixF));
65
for (int i = 0; i < 5; ++i) memcpy(&self->displays[i]->renderMatrix, &self->renderMatrix, sizeof(MatrixF));
66
67
self->timer += Engine.deltaTime;
68
if (self->timer > 0.5) {
69
self->arrowAlpha = 0x100;
70
self->timer = 0.0;
71
self->state = 1;
72
}
73
break;
74
}
75
case 1: {
76
CheckKeyDown(&keyDown);
77
CheckKeyPress(&keyPress);
78
SetRenderMatrix(&self->renderMatrix);
79
80
if (usePhysicalControls) {
81
if (touches > 0) {
82
usePhysicalControls = false;
83
}
84
else {
85
if (keyPress.up) {
86
}
87
else if (keyPress.down) {
88
}
89
90
if (keyPress.B) {
91
PlaySfxByName("Menu Back", false);
92
self->backPressed = false;
93
self->state = ABOUT_STATE_EXIT;
94
}
95
}
96
}
97
else {
98
if (touches > 0) {
99
self->backPressed = CheckTouchRect(128.0, -92.0, 32.0, 32.0) >= 0;
100
}
101
else {
102
if (keyPress.B || self->backPressed) {
103
PlaySfxByName("Menu Back", false);
104
self->backPressed = false;
105
self->state = ABOUT_STATE_EXIT;
106
}
107
else {
108
if (self->state == ABOUT_STATE_MAIN) {
109
if (keyDown.up) {
110
usePhysicalControls = true;
111
}
112
if (keyDown.down) {
113
usePhysicalControls = true;
114
}
115
}
116
}
117
}
118
}
119
break;
120
}
121
case 2: { // fade out
122
if (self->arrowAlpha > 0)
123
self->arrowAlpha -= 8;
124
125
if (self->timer < 0.2)
126
self->scale = fmaxf(self->scale + ((1.5f - self->scale) / ((Engine.deltaTime * 60.0) * 8.0)), 0.0);
127
else
128
self->scale = fmaxf(self->scale + ((-1.0f - self->scale) / ((Engine.deltaTime * 60.0) * 8.0)), 0.0);
129
130
NewRenderState();
131
MatrixScaleXYZF(&self->renderMatrix, self->scale, self->scale, 1.0);
132
MatrixTranslateXYZF(&self->matrixTemp, 0.0, 0, 160.0);
133
MatrixMultiplyF(&self->renderMatrix, &self->matrixTemp);
134
SetRenderMatrix(&self->renderMatrix);
135
136
memcpy(&self->label->renderMatrix, &self->renderMatrix, sizeof(MatrixF));
137
for (int i = 0; i < 5; ++i) memcpy(&self->displays[i]->renderMatrix, &self->renderMatrix, sizeof(MatrixF));
138
139
self->timer += Engine.deltaTime;
140
if (self->timer > 0.5) {
141
// mainMenu->state = 4;
142
RemoveNativeObject(self->label);
143
for (int i = 0; i < 5; ++i) RemoveNativeObject(self->displays[i]);
144
RemoveNativeObject(self);
145
return;
146
}
147
break;
148
}
149
}
150
151
RenderMesh(self->meshPanel, MESH_COLORS, false);
152
NewRenderState();
153
SetRenderMatrix(NULL);
154
155
if (self->backPressed)
156
RenderImage(128.0, -92.0, 160.0, 0.3, 0.3, 64.0, 64.0, 128.0, 128.0, 128.0, 128.0, self->arrowAlpha, self->textureArrows);
157
else
158
RenderImage(128.0, -92.0, 160.0, 0.3, 0.3, 64.0, 64.0, 128.0, 128.0, 128.0, 0.0, self->arrowAlpha, self->textureArrows);
159
}
160
#endif
161
162