Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-1-2-2013-Decompilation
Path: blob/main/RSDKv4/NativeObjects/DialogPanel.cpp
817 views
1
#include "RetroEngine.hpp"
2
3
void DialogPanel_Create(void *objPtr)
4
{
5
RSDK_THIS(DialogPanel);
6
self->panelMesh = LoadMesh("Data/Game/Models/Panel.bin", -1);
7
SetMeshVertexColors(self->panelMesh, 0x28, 0x5C, 0xB0, 0xFF);
8
self->buttonCount = DLGTYPE_YESNO;
9
}
10
11
void DialogPanel_Main(void *objPtr)
12
{
13
RSDK_THIS(DialogPanel);
14
NewRenderState();
15
SetRenderBlendMode(RENDER_BLEND_ALPHA);
16
17
switch (self->state) {
18
case DIALOGPANEL_STATE_SETUP: {
19
NativeEntity_PushButton *confirmButton = CREATE_ENTITY(PushButton);
20
self->buttons[0] = confirmButton;
21
if (self->buttonCount == DLGTYPE_OK) {
22
confirmButton->x = 0.0;
23
confirmButton->y = -40.0;
24
confirmButton->z = 0.0;
25
confirmButton->scale = 0.25;
26
confirmButton->bgColor = 0x00A048;
27
confirmButton->bgColorSelected = 0x00C060;
28
confirmButton->useRenderMatrix = true;
29
SetStringToFont8(confirmButton->text, " OK ", FONT_LABEL);
30
}
31
else {
32
confirmButton->x = -48.0;
33
confirmButton->y = -40.0;
34
confirmButton->z = 0.0;
35
confirmButton->scale = 0.25;
36
confirmButton->bgColor = 0x00A048;
37
confirmButton->bgColorSelected = 0x00C060;
38
confirmButton->useRenderMatrix = true;
39
SetStringToFont(confirmButton->text, strYes, FONT_LABEL);
40
41
NativeEntity_PushButton *noButton = CREATE_ENTITY(PushButton);
42
self->buttons[1] = noButton;
43
noButton->useRenderMatrix = true;
44
noButton->scale = 0.25;
45
noButton->x = 48.0;
46
noButton->y = -40.0;
47
noButton->z = 0.0;
48
SetStringToFont(noButton->text, strNo, FONT_LABEL);
49
}
50
self->scale = 224.0 / (GetTextWidth(self->text, FONT_TEXT, 1.0) + 1.0);
51
if (self->scale > 0.4)
52
self->scale = 0.4;
53
self->textX = GetTextWidth(self->text, FONT_TEXT, self->scale) * -0.5;
54
self->textY = GetTextHeight(self->text, FONT_TEXT, self->scale) * 0.5;
55
self->state = DIALOGPANEL_STATE_ENTER;
56
}
57
// FallThrough
58
case DIALOGPANEL_STATE_ENTER: {
59
self->buttonScale += ((0.77 - self->buttonScale) / ((Engine.deltaTime * 60.0) * 8.0));
60
if (self->buttonScale > 0.75)
61
self->buttonScale = 0.75;
62
NewRenderState();
63
MatrixScaleXYZF(&self->buttonMatrix, self->buttonScale, self->buttonScale, 1.0);
64
MatrixTranslateXYZF(&self->buttonMult, 0.0, 0.0, 160.0);
65
MatrixMultiplyF(&self->buttonMatrix, &self->buttonMult);
66
SetRenderMatrix(&self->buttonMatrix);
67
for (int i = 0; i < self->buttonCount; ++i) memcpy(&self->buttons[i]->renderMatrix, &self->buttonMatrix, sizeof(MatrixF));
68
69
self->stateTimer += Engine.deltaTime;
70
if (self->stateTimer > 0.5) {
71
self->state = DIALOGPANEL_STATE_MAIN;
72
self->stateTimer = 0.0;
73
}
74
break;
75
}
76
case DIALOGPANEL_STATE_MAIN: {
77
CheckKeyDown(&keyDown);
78
CheckKeyPress(&keyPress);
79
SetRenderMatrix(&self->buttonMatrix);
80
if (!usePhysicalControls) {
81
if (touches < 1) {
82
if (self->buttons[0]->state == 1) {
83
self->buttonSelected = 0;
84
self->state = DIALOGPANEL_STATE_ACTION;
85
PlaySfxByName("Menu Select", false);
86
self->buttons[0]->state = PUSHBUTTON_STATE_FLASHING;
87
}
88
if (self->buttonCount == DLGTYPE_YESNO && self->buttons[1]->state == 1) {
89
self->buttonSelected = 1;
90
self->state = DIALOGPANEL_STATE_ACTION;
91
PlaySfxByName("Menu Select", false);
92
self->buttons[1]->state = PUSHBUTTON_STATE_FLASHING;
93
}
94
}
95
else {
96
if (self->buttonCount == DLGTYPE_OK) {
97
self->buttons[0]->state =
98
CheckTouchRect(0.0, -30.0, (self->buttons[0]->textWidth + (self->buttons[0]->scale * 64.0)) * 0.75, 12.0) >= 0;
99
}
100
else {
101
self->buttons[0]->state =
102
CheckTouchRect(-36.0, -30.0, (self->buttons[0]->textWidth + (self->buttons[0]->scale * 64.0)) * 0.75, 12.0) >= 0;
103
self->buttons[1]->state =
104
CheckTouchRect(36.0, -30.0, (self->buttons[1]->textWidth + (self->buttons[1]->scale * 64.0)) * 0.75, 12.0) >= 0;
105
}
106
}
107
if (keyDown.left) {
108
usePhysicalControls = true;
109
self->buttonSelected = 1;
110
}
111
else if (keyDown.right) {
112
usePhysicalControls = true;
113
self->buttonSelected = 0;
114
}
115
}
116
else if (touches > 0) {
117
usePhysicalControls = false;
118
}
119
else if (self->buttonCount == DLGTYPE_OK) {
120
self->buttonSelected = 0;
121
if (keyPress.start || keyPress.A) {
122
self->state = DIALOGPANEL_STATE_ACTION;
123
PlaySfxByName("Menu Select", false);
124
self->buttons[self->buttonSelected]->state = 2;
125
}
126
}
127
else {
128
if (keyPress.left) {
129
PlaySfxByName("Menu Move", false);
130
if (--self->buttonSelected < 0)
131
self->buttonSelected = 1;
132
}
133
if (keyPress.right) {
134
PlaySfxByName("Menu Move", false);
135
if (++self->buttonSelected > 1)
136
self->buttonSelected = 0;
137
}
138
self->buttons[0]->state = 0;
139
self->buttons[1]->state = 0;
140
self->buttons[self->buttonSelected]->state = 1;
141
142
if (keyPress.start || keyPress.A) {
143
self->state = DIALOGPANEL_STATE_ACTION;
144
PlaySfxByName("Menu Select", false);
145
self->buttons[self->buttonSelected]->state = 2;
146
}
147
}
148
if (self->state == 2 && keyPress.B) {
149
PlaySfxByName("Menu Back", false);
150
self->selection = DLG_NO;
151
self->state = DIALOGPANEL_STATE_EXIT;
152
}
153
break;
154
}
155
case DIALOGPANEL_STATE_ACTION:
156
SetRenderMatrix(&self->buttonMatrix);
157
if (!self->buttons[self->buttonSelected]->state) {
158
self->state = DIALOGPANEL_STATE_EXIT;
159
160
self->selection = self->buttonSelected + 1;
161
if (self->buttonCount == DLGTYPE_OK)
162
self->selection = DLG_OK;
163
}
164
break;
165
case DIALOGPANEL_STATE_EXIT:
166
self->buttonScale = self->buttonScale + ((((self->stateTimer < 0.2) ? 1 : -1) - self->buttonScale) / ((Engine.deltaTime * 60.0) * 8.0));
167
if (self->buttonScale < 0.0)
168
self->buttonScale = 0.0;
169
NewRenderState();
170
MatrixScaleXYZF(&self->buttonMatrix, self->buttonScale, self->buttonScale, 1.0);
171
MatrixTranslateXYZF(&self->buttonMult, 0.0, 0.0, 160.0);
172
MatrixMultiplyF(&self->buttonMatrix, &self->buttonMult);
173
SetRenderMatrix(&self->buttonMatrix);
174
for (int i = 0; i < self->buttonCount; ++i) memcpy(&self->buttons[i]->renderMatrix, &self->buttonMatrix, sizeof(MatrixF));
175
176
self->stateTimer += Engine.deltaTime;
177
if (self->stateTimer > 0.5) {
178
for (int i = 0; i < self->buttonCount; ++i) RemoveNativeObject(self->buttons[i]);
179
RemoveNativeObject(self);
180
return;
181
}
182
break;
183
case DIALOGPANEL_STATE_IDLE: SetRenderMatrix(&self->buttonMatrix); break;
184
default: break;
185
}
186
RenderMesh(self->panelMesh, MESH_COLORS, false);
187
RenderText(self->text, FONT_TEXT, self->textX, self->textY, 0.0, self->scale, 255);
188
}
189